我有两个嵌套列表,每个嵌套列表包含两个字符串,例如:
list 1 [('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')] and list 2 [('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')]
我想比较两个列表并恢复那些彼此相同的嵌套列表。在这种情况下,只返回('DEF','[2,3,4]')
。这些清单可能会很长。有没有一种有效的方法呢?
答案 0 :(得分:8)
如果列表只包含字符串元组,那么最简单的方法是使用集合交集(&):
>>> set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')]) & set([('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')])
set([('DEF', '[2,3,4]')])
答案 1 :(得分:3)
使用集合执行此操作是一个非常好的实现,但为了获得最佳性能,您应该只使用一个集:
set1 = set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')])
matches = [x for x in [('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')] if x in set1]
答案 2 :(得分:0)
这是一种方法。将您的列表转换为集合并找到它们的交叉点。
>>> a,b = set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')]), set([('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')])
>>> print a.intersection(b)
set([('DEF', '[2,3,4]')])
我不认为它会因你的名单长度而降低很多。
答案 3 :(得分:0)
只需使用设置内置支持
def get_set(list1,list2):
s = set(list1)
s &= set(list2)
return s
Boom 这是你的工会
答案 4 :(得分:0)
intersection = [item for item in list1 if item in list2]
但是只使用它,如果由于某种原因你在列表中有可变项并且无法转换为集合。当然,这完全取决于列表的大小和重复的数量,但它可能要慢10倍。
答案 5 :(得分:0)
python 3.2
[i for i in list1 for v in list2 if i==v]