设置元素的同一列表的所有元素之间的交集
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
是集合列表。 set
是 set
类型。
对于成对计算,
这会计算列表 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)
我有一个列表-
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
是集合列表。 set
是 set
类型。
对于成对计算,
这会计算列表 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)