【问题标题】:Why is it possible to replace sometimes set() with {}?为什么有时可以用 {} 替换 set()?
【发布时间】:2016-08-09 00:23:51
【问题描述】:

在 PyCharm 中,当我编写时:

return set([(sy + ady, sx + adx)])

它说“函数调用可以用集合文字替换”所以它替换为:

return {(sy + ady, sx + adx)}

这是为什么呢? Python中的set()和字典{}不一样?

如果它想优化这个,为什么这更有效?

【问题讨论】:

标签: python set


【解决方案1】:

这是set()的另一种语法

>>> a = {1, 2}
>>> b = set()
>>> b.add(1)
>>> b.add(2)
>>> b
set([1, 2])
>>> a
set([1, 2])
>>> a == b
True
>>> type(a) == type(b)
True

dict 语法不同。它由键值对组成。例如:

my_obj = {1:None, 2:None}

【讨论】:

    【解决方案2】:

    Python 集合和字典都可以使用花括号来构造:

    my_dict = {'a': 1, 'b': 2}

    my_set = {1, 2, 3}

    解释器(和人类读者)可以根据它们的内容来区分它们。但是无法区分空集和空字典,因此在这种情况下您需要使用set() 对空集进行消歧。

    一个非常简单的测试表明字面构造更快(python3.5):

    >>> timeit.timeit('a = set([1, 2, 3])')
    0.5449375328607857
    >>> timeit.timeit('a = {1, 2, 3}')
    0.20525191631168127
    

    This question 涵盖了一些关于内置函数的文字构造性能问题,尽管是针对列表和字典。总结似乎是文字结构需要解释器的工作较少。

    【讨论】:

    • 文字构造可能更快,因为您不构建中间列表;如果你把它排除在外怎么办?
    • @jonrsharpe 似乎仍然较慢:timeit.timeit(stmt='a = set(mylist)', setup='mylist=[1, 2, 3]') -> 0.3987466390244663 - 我认为我添加的链接涵盖了其中的一些内容。
    • 哇,在 Python3.8 中,尝试您的测试,差异令人印象深刻:0.1970 vs 0.0705
    【解决方案3】:

    set([iterable]) 是从可选的可迭代iterable 创建集合的构造函数。而{} 是创建 set / dict 对象文字。所以创建什么取决于你如何使用它。

    In [414]: x = {}
    
    In [415]: type(x)
    Out[415]: dict
    
    In [416]: x = {1}
    
    In [417]: type(x)
    Out[417]: set
    
    In [418]: x = {1: "hello"}
    
    In [419]: type(x)
    Out[419]: dict
    

    【讨论】:

    • 当您说set([iterable]) 时,您的意思是文字字符[] 出现了吗?或者您是否使用 ABNF 来指示 iterable 是函数 set() 的可选参数?因为第一种情况是错误的,第二种情况是正确的。这很令人困惑,因为很多人会读到这里并认为您的意思是第一种情况。
    【解决方案4】:

    另一个例子set{} 不可互换(如 jonrsharpe 所述):

    In: f = 'FH'
    
    In: set(f)
    Out: {'F', 'H'}
    
    In: {f}
    Out: {'FH'}
    

    【讨论】:

    • set(f) 与文字的功能必须使用解包:{*f}
    • 永远不可能用{somestuff} 替换set(somestuff)。但是,只要 somestuff 在源代码中不是字面上的 0 个字符,就可以将 set([somestuff]) 替换为 {somestuff}。由于 OP 使用的是 set([somestuff])somestuff 不是 0 个字符,因此可以进行替换。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-03
    • 2012-09-14
    相关资源
    最近更新 更多