现在,在我的一个课堂实验作业中,我正在使用这段代码:
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索引超出范围错误。我真的不确定如何实施这个。
答案 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: ...
,但这更短。