Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较Python嵌套列表_Python_List_Nested_Intersection - Fatal编程技术网

比较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]