2012-04-30 6 views
10

Pythonはdictsに対してどのような種類のキーを受け入れるかに矛盾があるようです。それとも、別の言い方をすれば、dictsを定義する一つの方法では、キーの特定の種類を許可しますが、ない他で:python SyntaxError with dict(1 = ...)、しかし{1:...}は動作します

>>> 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")?私は好奇心が強い

...

答えて

17

これはdict問題が、Pythonの構文のアーティファクトではありません:キーワード引数は、有効な識別子でなければならない、と12はありません。

Python識別子の規則に従った文字列以外のものをキーとして使用する場合は、{}の構文を使用します。コンストラクタのキーワード引数構文は、いくつかの特別な場合に便宜のために存在します。

9

dictは関数呼び出しであり、関数キーワードは識別子でなければなりません。

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 
1

dictが関数呼び出しであると述べています。それは3つの構文形式を有する。

形式:(ここで使用される、またはname

dict(**kwargs) -> new dictionary initialized with the name=value pairs 
    in the keyword argument list. For example: dict(one=1, two=2) 

キーは、Python identifiers有効でなければならず、int値は有効ではありません。

>>> 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だけではありません。

あり:

dict(iterable) -> new dictionary initialized as if via: 
     d = {} 
     for k, v in iterable: 
      d[k] = v 

例:

dict(mapping) -> new dictionary initialized from a mapping object's 
    (key, value) pairs 

例:

>>> dict({1:'one',2:2}) 
{1: 'one', 2: 2} 
>>> dict([(1,'one'),(2,2)]) 
{1: 'one', 2: 2} 

とマッピングから

>>> 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} 
:それは非常に(文字通りの辞書から辞書)のように見える Counterdefaultdictがマッピングされていることを念頭に置いておくと、これはあなたが辞書にそれらのいずれかをひそかだろうかあるないかもしれませんが

関連する問題