设置元素的同一列表的所有元素之间的交集

Intersection between all elements of same list where elements are set

我有一个列表-

list_of_sets = [{0, 1, 2}, {0}]

我想计算列表元素之间的交集。我考虑过这个解决方案:

a =  list_of_sets[0]

b =  list_of_sets[1]

c =  set.intersection(a,b)

此解决方案有效,因为我知道列表中的元素数量。 (所以我可以声明尽可能多的变量,如 a、b 等)

我的问题是我无法找到另一种情况的解决方案,其中列表的元素数量未知。

N.B: 使用循环计算列表的元素个数并根据结果创建变量的思想 已经检查过了。因为我必须将我的代码保存在一个函数中(其中参数是 list_of_sets),所以我需要一个更 通用的解决方案,可以用于任何编号列表。

编辑 1:

我需要一个列表中所有元素的解决方案。 (不是成对的或 3/4 元素)

如果你想要 all_sets 的所有元素之间的交集:

intersection = set.intersection(*all_sets)

all_sets 是集合列表。 setset 类型。


对于成对计算,

这会计算列表 all_sets 中所有 2 组无序对的交集。如果您需要 3,则使用 3 作为参数。

from itertools import combinations, starmap
all_intersections = starmap(set.intersection, combinations(all_sets, 2))

如果您确实需要集合a、b进行计算,那么:

for a, b in combinations(all_sets, 2):
    # do whatever with a, b

你想要所有集合的交集。那么:

list_of_sets[0].intersection(*list_of_sets[1:])

应该可以。

从列表中取出第一个集合,然后将其与其余集合相交(用 * 解压列表)。

您可以为此使用 reduce。如果您使用 Python 3,则必须从 functools 导入它。这是一个简短的演示:

#!/usr/bin/env python

n = 30
m = 5

#Find sets of numbers i: 1 <= i <= n that are coprime to each number j: 2 <= j <= m
list_of_sets = [set(i for i in range(1, n+1) if i % j) for j in range(2, m+1)]

print 'Sets in list_of_sets:'
for s in list_of_sets:
    print s
print

#Get intersection of all the sets
print 'Numbers less than or equal to %d that are coprime to it:' % n
print reduce(set.intersection, list_of_sets)

输出

Sets in list_of_sets:
set([1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29])
set([1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19, 20, 22, 23, 25, 26, 28, 29])
set([1, 2, 3, 5, 6, 7, 9, 10, 11, 13, 14, 15, 17, 18, 19, 21, 22, 23, 25, 26, 27, 29, 30])
set([1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19, 21, 22, 23, 24, 26, 27, 28, 29])

Numbers less than or equal to 30 that are coprime to it:
set([1, 7, 11, 13, 17, 19, 23, 29])

实际上,我们甚至不需要reduce(),我们可以简单地做

set.intersection(*list_of_sets)