这应该做你想做的
import random as RND
import string
import itertools as IT
模拟一些数据
fnx = lambda: set(RND.sample(string.ascii_uppercase, 7))
S = [fnx() for c in range(5)]
生成 S 中集合的索引列表,以便下面可以更简洁地引用这些集合
idx = range(len(S))
获取 S 中所有可能的唯一项目对;然而,由于集合交集是可交换的,我们想要组合而不是排列
pairs = IT.combinations(idx, 2)
编写一个函数执行集合交集
nt = lambda a, b: S[a].intersection(S[b])
将此函数折叠在对上并将每个函数调用的结果键入其参数
res = dict([ (t, nt(*t)) for t in pairs ])
下面的结果按照OP中引用的第一个选项进行格式化,是一个字典,其中values是两个序列的交集;每个值keyed到由这些序列的两个索引组成的元组
这个解决方案,真的只是two代码行:(i)计算排列; (ii) 然后对每个排列应用一些函数,将返回值存储在结构化容器(键值)容器中
该解决方案的内存占用量很小,但您可以通过在最后一步中返回生成器表达式来做得更好,即
res = ( (t, nt(*t)) for t in pairs )
请注意,使用这种方法,对的序列和相应的交集都没有被写在内存中——即,pairs and res是迭代器。