Answers:
从Python 2.6版开始,您可以对使用多个参数set.intersection()
,例如
u = set.intersection(s1, s2, s3)
如果这些集合在列表中,则表示:
u = set.intersection(*setlist)
这里*a_list
是列表扩展
请注意,set.intersection
是不是一个静态的方法,但这种使用功能符号应用第一套交叉口列表的其余部分。因此,如果参数列表为空,则将失败。
如果您没有Python 2.6或更高版本,则可以选择编写一个显式的for循环:
def set_list_intersection(set_list):
if not set_list:
return set()
result = set_list[0]
for s in set_list[1:]:
result &= s
return result
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print set_list_intersection(set_list)
# Output: set([1])
您也可以使用reduce
:
set_list = [set([1, 2]), set([1, 3]), set([1, 4])]
print reduce(lambda s1, s2: s1 & s2, set_list)
# Output: set([1])
但是,许多Python程序员都不喜欢它,包括Guido本人:
大约12年前,Python获得了lambda,reduce(),filter()和map(),这是由(我相信)一个Lisp黑客(他错过了它们并提交了工作补丁)提供的。但是,尽管具有PR值,但我认为应该从Python 3000中删除这些功能。
所以现在reduce()。这实际上是我一直最讨厌的一个,因为除了一些涉及+或*的示例外,几乎每次我看到带有非平凡函数参数的reduce()调用时,我都需要拿笔和纸来在我了解reduce()应该做什么之前,请先绘制出该函数实际输入的内容。因此,在我看来,reduce()的适用性几乎仅限于关联运算符,在所有其他情况下,最好显式地写出累加循环。
result
为空时中断循环来进行优化。
在这里,我为多个集合交集提供了一个通用函数,试图利用现有的最佳方法:
def multiple_set_intersection(*sets):
"""Return multiple set intersection."""
try:
return set.intersection(*sets)
except TypeError: # this is Python < 2.6 or no arguments
pass
try: a_set= sets[0]
except IndexError: # no arguments
return set() # return empty set
return reduce(a_set.intersection, sets[1:])
Guido可能不喜欢reduce
,但我对此很喜欢:)
sets
而不是尝试访问sets[0]
和捕获IndexError
。
a_set
用于最终回报。
return reduce(sets[0], sets[1:]) if sets else set()
吗?
try
/ except
。这是一种代码气味,效率低下,并且可以隐藏其他问题。
reduce
“仅限于关联运算符”,在这种情况下适用。reduce
通常很难弄清楚,但是&
还算不错。