使用PyCharm,我注意到它提供转换字典文字:
d = {
'one': '1',
'two': '2',
}
转换为dict构造函数:
d = dict(one='1', two='2')
这些不同的方法是否在某些重要的方面有所不同?
(在写这个问题时,我注意到使用dict()似乎不可能指定一个数字键..D = {1: 'one', 2: 'two'}是可能的,但显然,dict(1='one'…)是不可能的。还有别的事吗?)
使用PyCharm,我注意到它提供转换字典文字:
d = {
'one': '1',
'two': '2',
}
转换为dict构造函数:
d = dict(one='1', two='2')
这些不同的方法是否在某些重要的方面有所不同?
(在写这个问题时,我注意到使用dict()似乎不可能指定一个数字键..D = {1: 'one', 2: 'two'}是可能的,但显然,dict(1='one'…)是不可能的。还有别的事吗?)
当前回答
这两种方法生成的字典完全相同,只是,正如您所注意到的,Python的词法规则有影响。
字典字面量是更明显的字典,您可以创建任何类型的键,但您需要引用键名。另一方面,如果你出于某种原因需要,你可以使用变量作为键:
a = "hello"
d = {
a: 'hi'
}
dict()构造函数为您提供了更大的灵活性,因为它采用多种形式的输入。例如,您可以为它提供一个对迭代器,它将把它们视为键/值对。
我不知道为什么PyCharm会提供将一种形式转换为另一种形式。
其他回答
我发现dict字面量d = {'one': '1'}更可读,你定义的数据,而不是分配东西值并将它们发送给dict()构造函数。
另一方面,我看到有人将字典文本错误地输入为d = {'one', '1'},这在现代python 2.7+中将创建一个集合。
尽管如此,我仍然更喜欢使用集合文字,因为我认为它更可读,我认为个人偏好。
python 3.4 + pycharm的一个重大区别是dict()构造函数 如果键数超过256,则产生“语法错误”消息。
我现在更喜欢使用字典字面。
来自python 2.7教程:
一对大括号创建一个空对象 字典:{}。放置一个 以逗号分隔的键:值列表 对括号内添加初始值 键:值对到字典; 这也是字典的方式 写在输出上。
tel = {'jack': 4098, 'sape': 4139}
data = {k:v for k,v in zip(xrange(10), xrange(10,20))}
而:
dict()构造函数构建 字典直接从列表 键值对存储为元组。当 这些对形成了一个模式,列表 推导式可以紧凑地指定 键值列表。
tel = dict([('sape', 4139), ('guido', 4127), ('jack', 4098)]) {'sape': 4139, 'jack': 4098, 'guido': 4127}
data = dict((k,v) for k,v in zip(xrange(10), xrange(10,20)))
当键是简单的字符串时,它 有时更容易指定对吗 使用关键字参数:
dict(sape=4139, guido=4127, jack=4098)
>>> {'sape': 4139, 'jack':4098, 'guido': 4127}
因此,{}和dict()都生成字典,但提供的字典数据初始化方式略有不同。
这两种方法生成的字典完全相同,只是,正如您所注意到的,Python的词法规则有影响。
字典字面量是更明显的字典,您可以创建任何类型的键,但您需要引用键名。另一方面,如果你出于某种原因需要,你可以使用变量作为键:
a = "hello"
d = {
a: 'hi'
}
dict()构造函数为您提供了更大的灵活性,因为它采用多种形式的输入。例如,您可以为它提供一个对迭代器,它将把它们视为键/值对。
我不知道为什么PyCharm会提供将一种形式转换为另一种形式。
Literal更快,因为它使用优化的BUILD_MAP和STORE_MAP操作码,而不是通用的CALL_FUNCTION:
> python2.7 -m timeit "d = dict(a=1, b=2, c=3, d=4, e=5)"
1000000 loops, best of 3: 0.958 usec per loop
> python2.7 -m timeit "d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}"
1000000 loops, best of 3: 0.479 usec per loop
> python3.2 -m timeit "d = dict(a=1, b=2, c=3, d=4, e=5)"
1000000 loops, best of 3: 0.975 usec per loop
> python3.2 -m timeit "d = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}"
1000000 loops, best of 3: 0.409 usec per loop