Python中,删除列表中所有出现的字符串。

10

假设我有一个列表:

main_list = ['bacon', 'cheese', 'milk', 'cake', 'tomato']

另一个列表:

second_list = ['cheese', 'tomato']

我如何从主列表中删除所有在第二个列表中找到的元素?

4个回答

11
new_array = [x for x in main_array if x not in second_array]
然而,对于大型列表来说,这种方式性能并不理想。您可以通过使用一个集合来优化second_array
second_array = set(second_array)
new_array = [x for x in main_array if x not in second_array]

如果项目的顺序不重要,您可以在两个数组中都使用一个 set:

new_array = list(set(main_array) - set(second_array))

我喜欢 Python 的表达能力 :). 就像你在说英语一样。 - Vikas
2
很好的回答,只需加入一个小优化:你可以先将second_array转换成集合,以优化维持顺序的变体:second_set = set(second_array); new_array = [x for x in main_array if x not in second_set] - roskakori

9

如果顺序不重要,您可以使用集合

>>> main_array = ['bacon', 'cheese', 'milk', 'cake', 'tomato']
>>> second_array = ['cheese', 'tomato']
>>> set(main_array) & set(second_array)
set(['tomato', 'cheese'])

这里我们使用交集运算符&。如果您只想要第二个列表中不存在的项目,我们可以使用差集-

>>> set(main_array) - set(second_array)
set(['cake', 'bacon', 'milk'])

如果需要保持顺序,那么这样做是行不通的。否则,这确实是最佳解决方案。然而,我认为他想要删除那些元素,所以请使用“-”而不是“&”。 - ThiefMaster
1
@ThiefMaster - 是的,而且他没有正确解释“我想要所有元素”的意思! - fraxel

3
main_array = set(['bacon', 'cheese', 'milk', 'cake', 'tomato'])
second_array = (['cheese', 'tomato'])

main_array.difference(second_array)
>>> set(['bacon', 'cake', 'milk'])

main_array.intersection(second_array)
>>> set(['cheese', 'tomato'])

0
l = [u'SQOOP', u'SOLR', u'SLIDER', u'SFTP', u'PIG', u'NODEMANAGER', u'JSQSH', u'HCAT', u'HBASE_REGIONSERVER', u'GANGLIA_MONITOR', u'FLUME_HANDLER', u'DATANODE', u'BIGSQL_WORKER']

p = [u'SQOOP', u'SOLR', u'SLIDER', u'SFTP']

l = [i for i in l if i not in [j for j in p]]

print l
[u'PIG', u'NODEMANAGER', u'JSQSH', u'HCAT', u'HBASE_REGIONSERVER', u'GANGLIA_MONITOR', u'FLUME_HANDLER', u'DATANODE', u'BIGSQL_WORKER']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接