Bil*_*kil 47 python union intersection set
我正在用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])
Run Code Online (Sandbox Code Playgroud)
那是好的,预期的行为 - 但是有了交集:
>> set([1,2,3]) & set([2,3,4])
set([2, 3])
>> set().intersection(*[[1,2,3], [2,3,4]])
set([])
Run Code Online (Sandbox Code Playgroud)
我在这里失去理智吗?为什么set.intersection()不像我期望的那样运行?
我怎么能像工作一样做多组的交集(假设[[1,2,3], [2,3,4]]有更多的列表)?"pythonic"的方式是什么?
Bre*_*arn 79
当你这样做时,set()你创建一个空集.当你这样做时,set().intersection(...)你将这个空集与其他东西相交.空集与任何其他集合集的交集为空.
如果你确实有一个集合列表,你可以得到他们的交集类似于你的方式.
>>> x = [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}]
>>> set.intersection(*x)
set([3])
Run Code Online (Sandbox Code Playgroud)
但是,你不能直接用你的方式做到这一点,因为你的例子中根本没有任何集合intersection(*...).你只有一个列表清单.您应该首先将列表中的元素转换为集合.所以,如果你有
x = [[1,2,3], [2,3,4]]
Run Code Online (Sandbox Code Playgroud)
你应该做
x = [set(a) for a in x]
Run Code Online (Sandbox Code Playgroud)
Joh*_*ooy 13
set().intersection(*[[1,2,3], [2,3,4]])
Run Code Online (Sandbox Code Playgroud)
当然是空的,因为你从空集开始并与所有其他集相交
您可以尝试调用该方法 class
set.intersection(*[[1,2,3], [2,3,4]])
Run Code Online (Sandbox Code Playgroud)
但这不起作用,因为传递的第一个参数需要是一个集合
set.intersection({1, 2, 3}, *[[2,3,4], ...])
Run Code Online (Sandbox Code Playgroud)
如果您可以首先使用集合列表,这看起来很尴尬.特别是如果它们来自发电机,这使得难以干净地拉出第一个物品
set.intersection(*[{1,2,3}, {2,3,4}])
Run Code Online (Sandbox Code Playgroud)
否则你可以把它们全部放进去
set.intersection(*(set(x) for x in [[1,2,3], [2,3,4]]))
Run Code Online (Sandbox Code Playgroud)
Ant*_*nto 10
将列表转换为先设置
>>> set.intersection(*[set([1,2,3]), set([2,3,4])])
set([2, 3])
Run Code Online (Sandbox Code Playgroud)
对于您可以使用的多个列表,
>>> set.intersection(*[set([1,2,3]), set([2,3,4]), set([5,3,4])])
set([3])
Run Code Online (Sandbox Code Playgroud)