当你遍历一个列表时,你永远不应该删除元素!那会打乱你的迭代。在 Python 中迭代列表时干净地编辑列表的唯一方法是在列表的长度上向后迭代并删除元素。
例如,这是一个有效的就地删除循环:
a = ['one two three', 'four five six', 'seven eight nine']
b = ['two', 'five six']
for i in range(len(a) - 1, -1, -1):
for x in b:
if x in a[i]:
del a[i]
print a # prints ['seven eight nine']
此外,在你的开场问题中,你说你想用文字比较。您当前的循环不会这样做。考虑一下,当您遍历 listb
时,您实际上是在尝试查看两个单词的字符串是否是a
. 您不想同时使用两个单词的字符串。您想将字符串拆分为单独的单词元素。为此,split()
功能是关键。
请注意,以下代码不会删除列表中的第二个元素:
a = ['one two three', 'four six five', 'seven eight nine']
b = ['two', 'five six']
for i in range(len(a) - 1, -1, -1):
for x in b:
if x in a[i]:
del a[i]
print a # prints ['four six five', 'seven eight nine']
我所做的只是切换“六”和“五”的顺序,a[1]
你的循环停止工作。那是因为它在字符串“四六五”中寻找字符串“五六”,显然找不到它,因为该特定字符串没有完全匹配。
现在,如果我们尝试split
将字符串转换为单词,我们实际上可以通过遍历单词列表来进行检查。
a = ['one two three', 'four six five', 'seven eight nine']
b = ['two', 'five six']
for i in range(len(a) - 1, -1, -1):
for x in b:
for word in x.split():
if word in a[i]:
del a[i]
print a # correctly prints ['seven eight nine']