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

时间:2015-04-05 16:08:09

标签: python list python-3.x for-loop

现在,在我的一个课堂实验作业中,我正在使用这段代码:

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索引超出范围错误。我真的不确定如何实施这个。

4 个答案:

答案 0 :(得分:1)

这里的问题是你正在编辑列表(缩短它),因为你正在迭代它。例如:

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

检查list_after_removal [0]:这是'foo',我们找到了一个匹配,所以弹出它,使list_after_removal等于[“bar”]

检查list_after_removal [1]:现在列表中只有一个项目,这会导致IndexError!

尝试使用此代替for-loop:

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

答案 1 :(得分:0)

您应该从条件中删除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

答案 2 :(得分:0)

你从这个名单中弹出两次!一旦进入if状态,第二次进入下一行。

将条件重写为:

... and len(list_after_removal) > 1

你知道一个列表在pop之后会缩短1个项目,不需要在这个条件下实际执行。

答案 3 :(得分:0)

由于您要从列表中删除元素,因此它最终将成为空列表。为避免错误,您可以这样使用if循环:

if list:
    list.pop()
else:
    print 'list is empty'

或者代之以while循环:

while list:
    list.pop()
else: 
    print 'list is empty'

您也可以使用if len(list) > 0: ...,但这更短。