如何从一个列表中删除包含在另一个列表中的单词的项目。

8 浏览
0 Comments

如何从一个列表中删除包含在另一个列表中的单词的项目。

我想要从列表 'a' 中移除包含列表 'b' 中的单词的项目。

结果应该是:

a = ['seven eight nine']

这是因为单词 'two' 和 'five six' 在列表 'a' 的项目中被找到。

以下是我尝试解决这个问题的方法:

for i in a:

for x in b:

if x in i:

a.remove(i)

这返回的结果是:

print a

['four five six', 'seven eight nine']

为什么这个方法不起作用,我该如何解决这个问题?

谢谢。

0
0 Comments

在迭代一个列表时,不应该删除元素!这会影响迭代。在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']

以上就是解决这个问题的原因和解决方法。

0
0 Comments

问题的出现原因:在迭代列表时修改列表本身会产生不可预期的副作用,例如循环会跳过某些项目。

解决方法:一般来说,在Python中应该避免逐个添加和删除元素的循环。通常可以用更符合Python风格的列表推导式来替代这种循环。

代码示例:

[sa for sa in a if not any(sb in sa for sb in b)]

另外,修复你的循环的一种方式是在迭代列表时使用列表的副本,这样循环不会受到对原始列表的更改的影响。

代码示例:

for i in a[:]:
    for x in b:
        if x in i:
            a.remove(i)

0
0 Comments

问题的出现原因是在迭代列表时编辑列表。解决方法是使用列表推导式和any。下面是代码解决方法:

a = ['one two three', 'four five six', 'seven eight nine']
b = ['two', 'five six']
print [el for el in a if not any(ignore in el for ignore in b)]

上述代码是使用列表推导式和any函数来从列表中删除包含另一个列表中单词的项。这样可以避免在迭代列表时编辑列表。

0