繁体   English   中英

如何检查一个列表中的任何元组是否在另一个列表中?

[英]How to to check if any tuples inside one list are inside another list?

我遇到的麻烦是这些元组位于列表列表的列表内,如下所示:

giantlist = [[[(0,2), (2,3), (4,5)],[(0,2), (3,4), (6,8)], [(3,4),(0,2)]]]

因此,我的问题是试图遍历每个列表,并找出它们是否具有共同的元组,然后我喜欢打印“在列表1和列表2之间找到共同点”。

例如:列表列表列表中的第一个列表是

[(0,2),(2,3),(4,5)]

并且它与第二个列表具有共同的元组,即点[[0,2)]

下面显示的第三个列表也具有公共点[[0,2)]

[(3,4),(0,2)]

然后,我想打印list1与list2和list3有一个共同点

我尝试了很多不同的循环,但是比较列表时遇到了麻烦,因为我无法正确索引它们。 我发现可以找到这些列表之间的交集,如果它们有交集,则可以打印。

我还发现,也许我可以获取每个列表的长度,然后对其进行合并,并检查合并长度是否小于两个列表的长度,这意味着它们具有一个共同的元组。

查看两个列表是否有交集的最简单方法是将它们变成集合,然后使用intersection方法或&运算符:

>>> lst1 = [(0,2),(2,3),(4,5)]
>>> lst2 = [(3,4),(0,2)]
>>> set(lst1) & set(lst2)
{(0, 2)}

如果效率(空间或速度)是个问题,您可能只想将较小的一个转换为一组:

>>> set(lst1).intersection(lst2) if len(lst1) > len(lst2) else set(lst2).intersection(lst1)

但是实际上,这和您可能需要的一样复杂。

当然,这并不能解决您的全部任务,仅解决您坚持的部分。 您仍然需要弄清楚如何将其应用于每对列表(或者比将其应用于每对列表更有效)。

有用于此目的的现有工具。 例如,您可以将collections.Counter用于O(n)解决方案,并将其与@hexparrot的flattener函数结合使用:

from collections import Counter

giantlist = [[[(0,2), (2,3), (4,5)],[(0,2), (3,4), (6,8)], [(3,4),(0,2)]]]

def flatten(container):
    for i in container:
        if isinstance(i, list):
            for j in flatten(i):
                yield j
        else:
            yield i

c = Counter(flatten(giantlist))

结果是一个字典,将每个元组映射到其计数:

Counter({(0, 2): 3, (3, 4): 2, (2, 3): 1, (4, 5): 1, (6, 8): 1})

您可以通过itertools.combinations修改上述解决方案以在特定列表之间进行比较。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM