我正在用Python做一些set操作,我注意到一些奇怪的事情......
>> set([1,2,3]) | set([2,3,4])
set([1, 2, 3, 4])
>> set().union(*[[1,2,3], [2,3,4]])
set([1, 2, 3, 4])
那是好的,预期的行为 - 但是有了交集:
>> set([1,2,3]) & set([2,3,4])
set([2, 3])
>> set().intersection(*[[1,2,3], [2,3,4]])
set([])
我在这里失去理智吗?为什么set.intersection()不像我期望的那样运行?
我如何像使用union一样进行多个集合的交集(假设[[1,2,3], [2,3,4]]
有更多的列表)? “pythonic”的方式是什么?
答案 0 :(得分:79)
执行set()
时,您正在创建一个空集。当你执行set().intersection(...)
时,你将这个空集与其他东西相交。空集与任何其他集合集的交集是空的。
如果你确实有一个集的列表,你可以得到他们的交集类似于你的方式。
>>> x = [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}]
>>> set.intersection(*x)
set([3])
但是,您不能直接使用您的方式执行此操作,因为您的示例intersection(*...)
实际上根本没有任何设置。您只有一个列表列表。您应该首先将列表中的元素转换为集合。所以,如果你有
x = [[1,2,3], [2,3,4]]
你应该做
x = [set(a) for a in x]
答案 1 :(得分:13)
set().intersection(*[[1,2,3], [2,3,4]])
当然是空的,因为你从空集开始并与所有其他集相交
您可以尝试在class
set.intersection(*[[1,2,3], [2,3,4]])
但这不起作用,因为传递的第一个参数需要是一个集合
set.intersection({1, 2, 3}, *[[2,3,4], ...])
如果您可以首先使用集合列表,这看起来很尴尬。特别是如果它们来自发电机,这使得很难干净地拉出第一件物品
set.intersection(*[{1,2,3}, {2,3,4}])
否则你可以将全部变成集合
set.intersection(*(set(x) for x in [[1,2,3], [2,3,4]]))
答案 2 :(得分:10)
将列表转换为先设置
>>> set.intersection(*[set([1,2,3]), set([2,3,4])])
set([2, 3])
对于您可以使用的多个列表,
>>> set.intersection(*[set([1,2,3]), set([2,3,4]), set([5,3,4])])
set([3])
答案 3 :(得分:1)
[删除了错误答案]
正如@Anto Vinish建议你首先应该将列表转换为集合,然后使用set.intersection
例如:
>>> sets = [set([1, 2, 3]), set([2, 3, 4]), set([3, 4, 5])]
>>> set.intersection(*sets)
set([3])