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

问题描述 投票:0回答:4

编写一个名为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”。该函数应返回新列表。

python-3.x
4个回答
0
投票

你是这样做的,搜索“z”区分大小写,尝试类似:

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

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


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']

0
投票

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


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 
© www.soinside.com 2019 - 2024. All rights reserved.