比较Python嵌套列表
我有两个嵌套列表,每个嵌套列表包含两个字符串,例如:比较Python嵌套列表,python,list,nested,intersection,Python,List,Nested,Intersection,我有两个嵌套列表,每个嵌套列表包含两个字符串,例如: 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]')
。名单可能会很长。有没有一种有效的方法可以做到这一点?如果列表只包含字符串元组,那么最简单的方法就是使用集合交集(&):
这里有一种方法。将列表转换为集合并找到它们的交点
>>> 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对set的内置支持即可
def get_set(list1,list2):
s = set(list1)
s &= set(list2)
return s
然后砰你的联盟来了
intersection = [item for item in list1 if item in list2]
但是,如果出于某种原因,您的列表中有可变项,并且无法转换为集合,则只能使用它。当然,这一切都取决于列表的大小和重复的数量,但很可能会慢10倍。使用集合来实现这一点是一个非常好的实现,但为了获得最佳性能,您应该只使用一个集合:
这通常比基于集合的解决方案更昂贵。是的。我现在亲眼看到了。在我的测试中,它是10的一个因子。但是,如果列表中包含的类型不可散列,那么这将起作用,而所有基于集合的解决方案都将失败。您能解释一下为什么这样更好吗?从序列生成一个集合需要遍历它,因此生成两个集合需要遍历两个序列。此外,在两个集合之间执行交集需要迭代其中一个集合,并在另一个集合上执行成员资格操作。因此,将它们都转换为序列并相交需要在一个序列中迭代一次,在另一个序列中迭代两次。我提供的解决方案只转换一个列表,然后直接迭代另一个,保存一个迭代总数。如果列表->集合转换和设置交集发生在C++中而不是Python,则可能更快。
intersection = [item for item in list1 if item in list2]
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]
python 3.2
[i for i in list1 for v in list2 if i==v]