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

时间:2015-02-24 05:56:10

标签: python list python-2.7 python-3.x 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元素)

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

你想要所有集合的交集。然后:

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

应该工作。

从列表中取出第一组,然后将其与其余部分交叉(使用*解压缩列表。)

答案 2 :(得分: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)