如何从一个列表中删除包含在另一个列表中的单词的项目。
在迭代一个列表时,不应该删除元素!这会影响迭代。在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 # 输出 ['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 # 输出 ['four six five', 'seven eight nine']
我只是交换了`a[1]`中的'six'和'five'的顺序,你的循环就停止工作了。那是因为它在字符串'four six five'中寻找字符串'five six',显然找不到因为没有完全匹配的字符串。
现在,如果我们将字符串拆分成单词,我们可以通过迭代单词列表来进行检查。
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 # 正确地输出 ['seven eight nine']
以上就是解决这个问题的原因和解决方法。