【问题标题】:Python union of sets raises TypeError集合的 Python 联合引发 TypeError
【发布时间】:2019-01-23 02:32:51
【问题描述】:

考虑一个集合序列:

>>> [{n, 2*n} for n in range(5)]
[{0}, {1, 2}, {2, 4}, {3, 6}, {8, 4}]

将它们直接传递给联合方法会产生正确的结果:

>>> set().union({0}, {1, 2}, {2, 4}, {3, 6}, {8, 4})
{0, 1, 2, 3, 4, 6, 8}

但是将它们作为列表或生成器表达式传递会导致 TypeError:

>>> set().union( [{n, 2*n} for n in range(5)] )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

>>> set().union({n, 2*n} for n in range(5))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'set'

为什么会发生,有什么解决办法?

【问题讨论】:

    标签: python set generator-expression set-union


    【解决方案1】:

    此错误的原因是set.union() 需要一个或多个集合(即set.union(oneset, anotherset, andathirdone)),而不是list 或生成器。

    解决方案是解压您的列表或生成器:

    >>> set().union( *({n, 2*n} for n in range(5)) )
    {0, 1, 2, 3, 4, 6, 8}
    

    【讨论】:

    • wrt/“为什么会发生”,答案很简单:set.union() 需要一个或多个集合,而不是列表或生成器。
    • @brunodesthuilliers 完全正确
    【解决方案2】:

    这是在不创建列表的情况下合并多个集合的方法

    s = set()
    
    for n in range(5): 
        s = s.union({n, 2*n})
    

    【讨论】:

    • 它确实有效,但这远不是最有效的代码(对于 range(10),它比 U9-Forward 的解决方案慢 50% 左右)。
    • @bruno 很公平,我只是遵守他在评论中提出的 NO-LISTS 规则。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-29
    • 1970-01-01
    • 2023-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多