Вопрос по python – Python SyntaxError с dict (1 =…), но {1:…} работает

10

У Python, похоже, есть несогласованность в том, какие ключи он принимает для диктовок. Или, другими словами, он разрешает определенные виды ключей в одном способе определения диктов, но не в других:

>>> 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   ответа
9

dict является вызовом функции, а ключевые слова функций должны быть идентификаторами.

1

Как сказал другой ответ,ДИКТ это вызов функции. Он имеет три синтаксические формы.

Форма:

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

Ключи (илиname как используется в этом случае) должен быть действительным Pythonидентификаторыи недействительные.

Ограничением является не только функция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}

Хотя это может показаться не таким уж большим (диктат из буквального слова), имейте в виду, чтосчетчик а такжеdefaultdict являются сопоставлениями, и вот как вы могли бы преобразовать один из них в диктовку:

>>> 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}
17

Это неdict проблема, но артефакт синтаксиса Python: аргументы ключевого слова должны быть действительными идентификаторами, и1 а также2 не.

Если вы хотите использовать в качестве ключа все, что не является строкой, соответствующей правилам идентификатора Python, используйте{} синтаксис. Синтаксис аргумента ключевого слова конструктора просто для удобства в некоторых особых случаях.

1

Если вы читаетедокументация, вы узнаете, чтоdict = {stringA = 1, stringB = 2} обозначения действительны, когда ключи представляют собой простые строки:

When the keys are simple strings, it is sometimes easier to specify pairs using keyword arguments:

>>>
>>> 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

Похожие вопросы