寻找一种方法来计算数字组合以及它们在不同列表中出现的次数(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 它的大小)
我有一个练习需要你的意见 我得到一个列表列表,每个列表的长度都不同,其中包含数字 我需要找出出现在其他列表中的最大数字组合(集合)是什么(我需要按列表进行)
例如: 在下面的数组中,您可以看到第 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 它的大小)