寻找一种方法来计算数字组合以及它们在不同列表中出现的次数(2 组及以上)

looking for a way to count combinations of numbers and how many times they appear in different lists ( sets of 2 and up )

我有一个练习需要你的意见 我得到一个列表列表,每个列表的长度都不同,其中包含数字 我需要找出出现在其他列表中的最大数字组合(集合)是什么(我需要按列表进行)

例如: 在下面的数组中,您可以看到第 1 行和第 3 行都只出现了 80 和 88 但是 93 94 122 167 出现在第 1 行和第 2 行 所以我需要 return 80,88 一次用于第 1 行和 93,94,122,167 一次用于第 2 行和第 3 行

arr = [[3,8,24,26,42,44,54,70,79,80,81,88,90,96,97,101,102,118,
        124,125,130,134,141,147,158,164,170,171,174,175,184],
       [5,21,23,39,41,51,67,76,77,78,85,87,93,94,98,99,115,121,
        122,127,131,138,144,155,161,167,168,171,172,181],
       [16,18,34,36,46,62,71,72,73,80,82,88,89,93,94,110,116,
        117,122,126,133,139,150,156,162,163,166,167,176]]

起初我想为每个列表/行做一个集合,然后比较集合 但这似乎很昂贵,尤其是因为最小集合是 2,而这个例子中的最大值是 31

比较每个列表中的集合的更好方法是什么?

郑重声明,起初我想每行做这样的事情:

import itertools

arr = [1,2,3,4,5,6,7,8]
  for length in range(0, len(arr)):
      for subset in itertools.combinations(arr, length):

我实际上并没有写任何代码,因为我知道这是非常未优化的

编辑,抱歉,如果我不清楚,我正在寻找 2 组及以上的组,而不仅仅是重复数字

您可以在 range(len(arr)) 上使用 itertools.combinations 来创建 2 组合迭代器。在对其进行迭代时,创建一个将 arr[i] 映射到集合交集的字典。

最后,使用字典理解select每个子列表索引的最大集合并将它们转换为列表。

from itertools import combinations
tmp = {}
for i, j in combinations(range(len(arr)), 2):
    set_inter = set(arr[i]) & set(arr[j])
    tmp.setdefault(i, []).append(set_inter)
    tmp.setdefault(j, []).append(set_inter)
out = {k: list(max(v, key=len)) for k, v in tmp.items()}

输出:

{0: [80, 88], 1: [122, 93, 94, 167], 2: [122, 93, 94, 167]}

max(v, key=len) 正在寻找最大的集合(因为 len(set) returns 它的大小)