对列表使用.pop(),除非它会导致列表为空

2024-04-20 01:59:56 发布

您现在位置:Python中文网/ 问答频道 /正文

现在在我的一个课堂实验作业中,我使用了以下代码:

x=0
for x in reversed(range(len(list_after_removal))):
    if guess in list_after_removal[x]:
        list_after_removal.pop(x)
        x+=1
    else:
        x+=1

我的问题是,如果用户猜到了所有元音或者其他字母的组合,列表就会变成空的,我会得到一个错误。最后,我希望程序在实际删除单词之前,先看看列表的长度。你知道吗

我试过这样的方法:

x=0
for x in reversed(range(len(list_after_removal))):
    if guess in list_after_removal[x] and len(list_after_removal.pop(x))>0:
        list_after_removal.pop(x)
        x+=1
    else:
        x+=1

但这会导致pop索引超出范围的错误。我真的不知道如何去实施这个。你知道吗


Tags: in列表forlenif错误rangepop
3条回答

这里的问题是,您在迭代列表时正在编辑列表(缩短列表)。例如:

>>> guess = 'o'
>>> list_after_removal = ['foo', 'bar']

移除后的检查列表[0]:这是'foo',我们找到了一个匹配项,所以弹出它,使移除后的列表等于[“bar”]

删除后的检查列表[1]:现在列表中只有一项,这将导致索引器错误!你知道吗

尝试以下操作而不是for循环:

>>> guess = 'o'
>>> list_after_removal = ['foo', 'bar']
>>> without_guess = filter(lambda word: guess not in word, list_after_removal)
>>> if len(without_guess) > 0:
...     list_after_removal = without_guess
... else:
...     # Choose a word from list_after_removal because all of the words contain their guess
...     the_word = list_after_removal[0]
...
>>> list_after_removal
['bar']

如果lambda函数太混乱,那么这也适用:

>>> guess = 'o'
>>> list_after_removal = ['foo', 'bar']
>>> def not_in(word):
...     return guess not in word
...
>>> without_guess = filter(not_in, list_after_removal)
>>> if len(without_guess) > 0:
...     list_after_removal = without_guess
... else:
...     # Choose a word from list_after_removal because all of the words contain their guess
...     the_word = list_after_removal[0]
...
>>> list_after_removal
['bar']

您应该从条件中删除pop,也不需要len,因为空列表的bool值是False

>>> bool([])
False
>>> bool([1])
True

所以你可以:

x=0
for x in reversed(range(len(list_after_removal))):
    if guess in list_after_removal[x] and list_after_removal:
        list_after_removal.pop(x)
        x+=1
    else:
        x+=1

你两次从名单上跳出来!一次在if条件下,第二次在下一行。你知道吗

重做条件如下:

... and len(list_after_removal) > 1

你知道在你从列表中pop得到一个列表后,它会短一个项目,而不需要在这个条件下实际执行。你知道吗

相关问题 更多 >