初始化dict的首选语法是什么:花括号文字{}或dict()函数?

时间:2010-05-17 23:37:08

标签: python dictionary

我正在努力学习Python,我正在密切关注常见的编码标准。这可能看起来像是一个毫无意义的挑剔问题,但我正在努力专注于我学习的最佳实践,所以我不必忘记任何“坏”习惯。

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

a = {
    'a': 'value',
    'another': 'value',
}

b = dict( 
    a='value',
    another='value',
)

哪个被认为是“更加pythonic”?你用哪个?为什么呢?

7 个答案:

答案 0 :(得分:213)

大括号。将关键字参数传递给dict(),虽然它在很多场景中都能很好地工作,但只有在键是有效的Python标识符时才能初始化映射。

换句话说,它无法做到:

a = {'import': 'trade', 1: 7.8}

答案 1 :(得分:76)

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

# Works fine.
a = {
    'a': 'value',
    'b=c': 'value',
}

# Eeep! Breaks if trying to be consistent.
b = dict( 
    a='value',
    b=c='value',
)

答案 2 :(得分:56)

第一个版本更可取:

  • 适用于所有类型的键,例如,您可以说{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
    
  • 如果不打算使用字典文字的特殊语法,则可能不存在。

答案 3 :(得分:3)

我认为第一个选项更好,因为您要将值作为['a']或['another']来访问。你字典中的键是字符串,没有理由假装它们不是。对我来说,关键字语法起初看起来很聪明,但在第二眼看起来却模糊不清。只有在使用__dict__时,这才对我有意义,关键字将在以后成为属性。

答案 4 :(得分:2)

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

    class mydict(dict): pass
    a = mydict()        
    a["b=c"] = 'value'
    a.test = False

答案 5 :(得分:2)

我几乎总是使用花括号;但是,在某些情况下,当我编写测试时,我会使用关键字打包/拆包,在这种情况下,dict()更具可维护性,因为我不需要更改:

a=1,
b=2,

收件人:

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

它在某些情况下也有帮助,在某些情况下,我认为以后可能需要将其转换为namedtuple或类实例。

在实现本身中,由于我对优化的痴迷,并且当我没有看到特别巨大的可维护性收益时,我将始终青睐花括号。

在测试和实现中,如果有可能在那时或将来添加键,则我将永远不会使用dict():

  • 并非总是字符串
  • 不仅包含数字,ASCII字母和下划线
  • 以整数开头(dict(1foo=2)引发SyntaxError)

答案 6 :(得分:1)

有时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(0,100)for x in range(0,7)]))