-1

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

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 有一个共同点

我尝试了很多不同的循环,但我无法比较列表,因为我无法正确索引它们。我想我可以找到这些列表之间的交集,如果它们有交集,那么我会打印。

我还发现,也许我可以得到每个列表的长度,然后将它们联合起来,并检查联合长度是否小于两个列表的长度,这意味着它们有一个共同的元组。

4

2 回答 2

3

查看两个列表是否有任何交集的最简单方法是将它们转换为集合,然后使用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)

但实际上,这就像你可能需要得到的那样复杂。

当然,这并不能解决你的整个任务,只是你坚持的部分。您仍然需要弄清楚如何将其应用于每对列表(或者您可以做什么比将其应用于每对列表更有效)。

于 2018-03-08T19:45:24.883 回答
1

现有的工具可以做到这一点。例如,您可以使用collections.CounterO(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.

于 2018-03-08T19:44:07.263 回答