代码之家  ›  专栏  ›  技术社区  ›  daotoad

初始化dict:curly brace literals或dict()函数的首选语法是什么?

  •  183
  • daotoad  · 技术社区  · 16 年前

    我正在努力学习Python,并且非常关注通用的编码标准。这似乎是一个毫无意义的挑剔的问题,但我正在努力集中在最佳实践,因为我学会了,所以我不必忘记任何“坏”习惯。

    我看到两种初始化dict的常用方法:

    a = {
        'a': 'value',
        'another': 'value',
    }
    
    b = dict( 
        a='value',
        another='value',
    )
    

    哪个被认为是“更多的蟒蛇”?你用什么?为什么?

    7 回复  |  直到 7 年前
        1
  •  208
  •   machine yearning    10 年前

    花冠。将关键字参数传递到 dict() 尽管它在许多场景中都能很好地工作,但只有当键是有效的Python标识符时,它才能初始化映射。

    换句话说,它不能做到:

    a = {'import': 'trade', 1: 7.8}
    
        2
  •  76
  •   Amber    16 年前

    第一个是花括号。否则,您会遇到密钥中包含奇数字符的一致性问题,例如 = .

    # Works fine.
    a = {
        'a': 'value',
        'b=c': 'value',
    }
    
    # Eeep! Breaks if trying to be consistent.
    b = dict( 
        a='value',
        b=c='value',
    )
    
        3
  •  55
  •   stephan    16 年前

    首选第一个版本:

    • 它适用于所有类型的键,例如,您可以说 {1: 'one', 2: 'two'} . 第二个变量只适用于(某些)字符串键。根据键的类型使用不同的语法是不必要的不一致性。
    • 速度更快:

      $ python -m timeit "dict(a='value', another='value')"
      1000000 loops, best of 3: 0.79 usec per loop
      $ python -m timeit "{'a': 'value','another': 'value'}"
      1000000 loops, best of 3: 0.305 usec per loop
      
    • 如果不打算使用字典文本的特殊语法,那么它可能不存在。
        4
  •  3
  •   dividebyzero    13 年前

    我认为第一个选项更好,因为您要将这些值作为一个[‘A’]或一个[‘另一个’]访问。字典中的键是字符串,没有理由假装它们不是字符串。对我来说,关键词语法一开始看起来很聪明,但第二次看起来却很模糊。这对我来说是有意义的,如果你和 __dict__ ,关键字稍后将成为属性,类似这样。

        5
  •  2
  •   Joshua Richardson    12 年前

    仅供参考,如果您需要向字典添加属性(附加到字典的内容,但不是其中一个键),那么您将需要第二个表单。在这种情况下,您可以使用具有任意字符的键初始化字典,一次一个,如下所示:

        class mydict(dict): pass
        a = mydict()        
        a["b=c"] = 'value'
        a.test = False
    
        6
  •  2
  •   user989266    7 年前

    我几乎总是使用大括号;但是,在一些编写测试的情况下,我会进行关键字打包/解包,在这些情况下,dict()更易于维护,因为我不需要更改:

    a=1,
    b=2,
    

    到:

    'a': 1,
    'b': 2,
    

    在某些情况下,如果我想稍后将其转换为一个命名的上传或类实例,它也会有所帮助。

    在实现本身中,由于我对优化的痴迷,并且当我没有看到特别大的可维护性好处时,我总是喜欢花括号。

    在测试和实现中,如果当时或将来添加的键有可能:

    • 不总是一根绳子
    • 不仅包含数字、ASCII字母和下划线
    • 以整数开头( dict(1foo=2) 引发语法错误)
        7
  •  1
  •   Reblochon Masque    8 年前

    有时 dict() 是个不错的选择:

    a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))
    
    mydict=dict(zip(['mon','tue','wed','thu','fri','sat','sun'],
    

    [Random.Randint(0100),用于范围(0,7)中的x)