当你遍历一个列表时,你永远不应该删除元素!那会打乱你的迭代。在 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']
此外,在您的开场问题中,您说您想使用文字比较。您当前的循环不会这样做。考虑一下,当您遍历列表b 时,实际上您尝试查看两个单词的字符串是否是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']