Python从列表中删除项目,这些列表存在于另一个列表中,但保留了不相交的重复项

时间:2015-11-13 22:07:46

标签: python list

我使用python尝试删除与其他列表交叉的项目。以下就是我所拥有的。

int *hidden_k=hidden_p;

我想要的是从字母列表中删除缺点列表中的任何字母,但保留其他所有字母。所以下面是我想要的。

letter = ['a', 'a', 'i', 'd', 'e', 'i', 'a', 'b', 'b', 'c', 'o', 'g', 'a', 'f', 'f', 'i', 'g', 'i' ]
cons = ['b','c','d', 'f', 'g']

以下是我到目前为止所尝试的内容,但它无效。

 letter = ['a', 'a', 'i', 'e', 'i', 'a', 'o', 'a', i', 'i' ]

和...

for i in letter[:]:
    if i in cons: 
         letter.remove(i)
         cons.remove(i)

我只想删除列表的交集,并保留第一个列表中不在第二个列表中的重复项。到目前为止,我所尝试过的所有内容都已从我要保留的第一个列表中删除了那些重复内容。非常感谢任何帮助!

2 个答案:

答案 0 :(得分:8)

>>> letter = ['a', 'a', 'i', 'd', 'e', 'i', 'a', 'b', 'b', 'c', 'o', 'g', 'a', 'f', 'f', 'i', 'g', 'i' ]
>>> cons = ['b','c','d', 'f', 'g']

>>> [x for x in letter if x not in cons]
['a', 'a', 'i', 'e', 'i', 'a', 'o', 'a', 'i', 'i']

一个简单的列表理解会做到这一点吗?

编辑:

正如ShadowRanger所说,它会提高性能(主要是对于比这些更大的数据集)将利益转换为集合:

cons = set(cons)

然后进入列表comp。这样做会更好,因为sets经过哈希处理并且可以更快地获取项目/检查项目

答案 1 :(得分:2)

列表理解更好,但如果我们只删除一行,则原始代码有效:

>>> letter = ['a', 'a', 'i', 'd', 'e', 'i', 'a', 'b', 'b', 'c', 'o', 'g', 'a', 'f', 'f', 'i', 'g', 'i' ]
>>> cons = ['b','c','d', 'f', 'g']
>>> for i in letter[:]:
...     if i in cons:
...          letter.remove(i)
...
>>> letter
['a', 'a', 'i', 'e', 'i', 'a', 'o', 'a', 'i', 'i']