python语法错误与dict(1 = ...),但{1:...}有效

时间:2012-04-30 21:09:14

标签: python dictionary notation

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")根本没办法吗?

我好奇......

4 个答案:

答案 0 :(得分:17)

这不是dict问题,而是Python语法的工件:关键字参数必须是有效的标识符,12不是。

如果要使用非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字面上的字典)但请记住Counterdefaultdict是映射,这就是你将其中一个转换成字典的方式:< / 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}