我正在努力学习Python,并密切关注通用编码标准。这似乎是一个毫无意义的吹毛求疵的问题,但我正努力把注意力集中在学习的最佳实践上,这样我以后就不必忘记任何“坏”习惯了。
我看到了两种常用的dict初始化方法:
a = { 'a': 'value', 'another': 'value', } b = dict( a='value', another='value', )
哪种被认为更“python化”?你用哪一种?为什么?
第一个,大括号。否则,您将遇到包含奇数字符的键的一致性问题,如=。
=
# Works fine. a = { 'a': 'value', 'b=c': 'value', } # Eeep! Breaks if trying to be consistent. b = dict( a='value', b=c='value', )
第一个版本更可取:
{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
花括号。将关键字参数传递给dict(),尽管它在很多情况下工作得很好,但只有当键是有效的Python标识符时才能初始化映射。
dict()
a = {'import': 'trade', 1: 7.8}
a = dict({'import': 'trade', 1: 7.8})
a = dict(import='trade', 1=7.8)
它将导致以下错误:
a = dict(import='trade', 1=7.8) ^ SyntaxError: invalid syntax
我认为第一个选项更好,因为您将以a['a']或a['another']的方式访问值。字典中的键是字符串,没有理由假装它们不是。对我来说,关键字语法乍一看很聪明,但再一看就模糊了。只有当你使用__dict__时,这对我来说才有意义,而关键字稍后将成为属性,诸如此类。
__dict__
供您参考,如果您需要向字典添加属性(附加到字典的东西,但不是键之一),那么您将需要第二种形式。在这种情况下,你可以用任意字符的键初始化你的字典,一次一个,如下所示:
class mydict(dict): pass a = mydict() a["b=c"] = 'value' a.test = False
有时候dict()是一个不错的选择:
a=dict(zip(['Mon','Tue','Wed','Thu','Fri'], [x for x in range(1, 6)]))
我几乎总是使用大括号;然而,在某些情况下,当我在编写测试时,我做关键字打包/解包,在这些情况下,dict()更易于维护,因为我不需要更改:
a=1, b=2,
:
'a': 1, 'b': 2,
在某些情况下,当我想稍后将其转换为命名元组或类实例时,它也会有所帮助。
在实现本身,由于我对优化的痴迷,并且当我没有看到特别大的可维护性好处时,我总是倾向于使用大括号。
在测试和实现中,我永远不会使用dict(),如果当时或将来添加的键有可能会:
dict(1foo=2)