我有两个嵌套列表,每个嵌套列表包含两个字符串,例如:
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]')
被退回。清单可能会很长。有没有一种有效的方法来做到这一点?
我有两个嵌套列表,每个嵌套列表包含两个字符串,例如:
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]')
被退回。清单可能会很长。有没有一种有效的方法来做到这一点?
如果列表只包含字符串元组,那么最简单的方法是使用集合交集 (&):
>>> set([('EFG', '[3,4,5]'), ('DEF', '[2,3,4]')]) & set([('DEF', '[2,3,4]'), ('FGH', '[4,5,6]')])
set([('DEF', '[2,3,4]')])
使用集合来做到这一点是一个非常好的实现,但为了获得最佳性能,您应该只使用一个集合:
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]
intersection = [item for item in list1 if item in list2]
但只有在由于某种原因您的列表中有可变变量并且无法转换为集合时才使用它。当然,这完全取决于列表的大小和重复的数量,但它很可能会慢 10 倍。
这是一种方法。将您的列表转换为集合并找到它们的交集。
>>> 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]')])
我认为它不会随着您列表的长度而降低很多。
只需使用set对集合 的内置支持
def get_set(list1,list2):
s = set(list1)
s &= set(list2)
return s
繁荣有你的工会
python 3.2
[i for i in list1 for v in list2 if i==v]