为什么在结果中显示此结果(列表索引超出范围)?

时间:2019-04-14 05:55:30

标签: python-3.x

编写一个称为stop_at_z的函数,该函数遍历字符串列表。使用while循环,将每个字符串附加到新列表中,直到出现的字符串为“ z”。该函数应返回新列表。

def stop_at_z(str):
    d = 0 
    x=[]
    str1 = list(str)
    while True : 
        if str1[d] != 'Z' :            
            x.append(str1[d])
            d+=1
        if str1[d] == 'Z' :
            break 
    return x 

使用while循环,将每个字符串附加到新列表中,直到出现的字符串为“ z”。该函数应返回新列表。

6 个答案:

答案 0 :(得分:1)

您收到此错误消息是因为如果字符串中没有大写字母'Z',d会无限增加。相反,您应该只在while循环中而未达到输入字符串的完整长度:

def stop_at_z(inputstr):
    d = 0 
    x=[]
    str1 = list(inputstr)
    while d<len(inputstr) :      
        if str1[d] == 'z' :
            break 
        else:           
            x.append(str1[d])
            d+=1
    return x 

请注意,您可以使用takewhile() from the itertools module实现相同的目的:

from itertools import takewhile

def stop_at_z(inputstr):
    return list(takewhile(lambda i: i != 'z', inputstr))

print(stop_at_z("hello wzrld"))

输出:

['h', 'e', 'l', 'l', 'o', ' ', 'w']

答案 1 :(得分:0)

如果字符串'z'不在列表中怎么办?
然后继续增加索引并最终遇到错误。

答案 2 :(得分:0)

这就是您的操作方式,搜索“ z”区分大小写,请尝试以下操作:

If str1[d].strip().lower() == “z”

它将剥离前导空格和尾随空格,然后将str1元素转换为小写字母(这两个都只返回修改后的字符串,因此原始字符串不变)并将其与小写字母z比较

答案 3 :(得分:0)

仅将循环限制为列表的长度应该会有所帮助。

def stop_at_z(str):
    d = 0 
    x=[]
    str1 = list(str)
    for d in range(0,len(str1)) : 
        print(d)
        if str1[d] != 'Z' :            
            x.append(str1[d])
        else:
            break 
    return x 

答案 4 :(得分:0)

基本上,我们需要一个可以包含所有字符的列表,直到获得“ z”为止。我们可以做到的一种方法是,首先将字符串转换为列表,然后迭代该列表,并将每个字符添加到新列表ls中,直到得到“ z”为止。但是问题是我们可能会得到一个不带“ z”的字符串,因此我们需要迭代直到该列表的长度。我希望一切都清楚。

def stop_at_z(s):
    ls = []
    idx = 0
    x = list(s)
    while idx<len(x):
        if x[idx]=="z":
            break
        ls.append(x[idx])
        idx+=1
    return ls

答案 5 :(得分:0)

这是我第一次在这里发帖,但是我使用了while循环:

def stop_at_z(input_list):
    print (input_list)
    output_list=[]
    index=0
    while index< len(input_list):
        if input_list[index] != "z":
            output_list.append(input_list[index])
            index+=1
        else:
            break
    return output_list