Python似乎与dicts接受的密钥类型不一致。或者,换句话说,它允许某种类型的键以一种方式定义dicts,但不允许在其他方面:
>>> d = {1:"one",2:2}
>>> d[1]
'one'
>>> e = dict(1="one",2=2)
File "<stdin>", line 1
SyntaxError: keyword can't be an expression
{...}
符号是否更基本,而dict(...)
只是语法糖?是因为Python parse dict(1="one")
根本没办法吗?
我好奇......
答案 0 :(得分:17)
这不是dict
问题,而是Python语法的工件:关键字参数必须是有效的标识符,1
和2
不是。
如果要使用非Python字符串规则后的字符串作为键,请使用{}
语法。在某些特殊情况下,构造函数关键字参数语法就是为了方便起见。
答案 1 :(得分:9)
dict
是函数调用,函数关键字必须是标识符。
答案 2 :(得分:1)
如果你阅读了documentation,当密钥是简单的字符串时,你会发现dict = {stringA = 1, stringB = 2}
符号是有效的:
当键是简单的字符串时,有时更容易指定 使用关键字参数对:
>>> >>> dict(sape=4139, guido=4127, jack=4098) {'sape': 4139, 'jack': 4098, 'guido': 4127}
由于整数(或其他数字)不是有效的关键字参数,dict = {1 = 2, 3 = 4}
将失败,因为如果您在用数字命名它时向其传递参数,则对函数的任何调用都会失败:
>>> def test(**kwargs):
... for arg in kwargs:
... print arg, kwargs[arg]
...
>>> test(a=2,b=3)
a 2
b 3
>>> test(1=2, 3=4)
File "<stdin>", line 1
SyntaxError: keyword can't be an expression
答案 3 :(得分:1)
正如其他答案所述,dict是函数调用。它有三种句法形式。
表格:
dict(**kwargs) -> new dictionary initialized with the name=value pairs
in the keyword argument list. For example: dict(one=1, two=2)
密钥(或本例中使用的name
)必须是有效的Python identifiers,而且int无效。
限制不仅仅是函数dict
你可以这样证明:
>>> def f(**kw): pass
...
>>> f(one=1) # this is OK
>>> f(1=one) # this is not
File "<stdin>", line 1
SyntaxError: keyword can't be an expression
但是,您可以使用另外两种语法形式。
有:
dict(iterable) -> new dictionary initialized as if via:
d = {}
for k, v in iterable:
d[k] = v
示例:
>>> dict([(1,'one'),(2,2)])
{1: 'one', 2: 2}
从映射:
dict(mapping) -> new dictionary initialized from a mapping object's
(key, value) pairs
示例:
>>> dict({1:'one',2:2})
{1: 'one', 2: 2}
虽然这看起来似乎不太多(dict字面上的字典)但请记住Counter和defaultdict是映射,这就是你将其中一个转换成字典的方式:< / p>
>>> from collections import Counter
>>> Counter('aaaaabbbcdeffff')
Counter({'a': 5, 'f': 4, 'b': 3, 'c': 1, 'e': 1, 'd': 1})
>>> dict(Counter('aaaaabbbcdeffff'))
{'a': 5, 'c': 1, 'b': 3, 'e': 1, 'd': 1, 'f': 4}