【问题标题】:Python set Union and set Intersection operate differently?Python set Union 和 set Intersection 的操作方式不同?
【发布时间】:2013-11-04 01:07:02
【问题描述】:

我在 Python 中做一些集合操作,我发现了一些奇怪的东西..

>> 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”的方式是什么?

【问题讨论】:

    标签: python set union intersection


    【解决方案1】:

    [删除错误答案]

    正如@Anto Vinish 建议的那样,您应该首先将列表转换为集合,然后使用 set.intersection

    例如:

    >>> sets = [set([1, 2, 3]), set([2, 3, 4]), set([3, 4, 5])]
    >>> set.intersection(*sets)
    set([3])
    

    【讨论】:

    • 如何以与合并多个集合类似的方式相交多个集合?
    • @Hypuk 如果答案不正确,您可以将其删除(如果您愿意)
    【解决方案2】:

    将列表转换为先设置

    >>> 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])
    

    【讨论】:

    • set.intersection 不同于 set().intersection
    • 它确实实现了我正在寻找的输出
    【解决方案3】:
    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]]))
    

    【讨论】:

      【解决方案4】:

      当您执行set() 时,您正在创建一个空集。当您执行set().intersection(...) 时,您正在将这个空集与其他东西相交。一个空集与任何其他集合的交集是空的。

      如果你真的有一个集合的列表,你可以得到它们的交集,就像你做的那样。

      >>> x = [{1, 2, 3}, {2, 3, 4}, {3, 4, 5}]
      >>> set.intersection(*x)
      set([3])
      

      但是,您不能以您的方式直接执行此操作,因为在您使用intersection(*...) 的示例中实际上根本没有任何集合。你只有一个 lists 的列表。您应该首先将列表中的元素转换为集合。所以如果你有

      x = [[1,2,3], [2,3,4]]
      

      你应该这样做

      x = [set(a) for a in x]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-23
        • 2018-08-15
        • 2013-12-26
        • 2023-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多