我正在努力学习Python,我正在密切关注常见的编码标准。这可能看起来像是一个毫无意义的挑剔问题,但我正在努力专注于我学习的最佳实践,所以我不必忘记任何“坏”习惯。
我看到两种常用的方法来初始化dict:
a = {
'a': 'value',
'another': 'value',
}
b = dict(
a='value',
another='value',
)
哪个被认为是“更加pythonic”?你用哪个?为什么呢?
答案 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():
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)]))