2012-04-10 3 views
2

Я хочу отформатировать словарь для печати (Python 2.7.3), а словарь имеет кортежи как ключи. С другими типами клавиш я могу сделатьPython: словарь форматирования с кортежем как ключи

>>> coord = {'latitude': '37.24N', 'longitude': '-115.81W', 'altitude':100} 
>>> 'Coordinates: {0[latitude]}, {0[longitude]}'.format(coord) 
'Coordinates: 37.24N, -115.81W' 

Я пробовал то же самое, но он не работает с ключами кортежа.

>>> a={(1,1):1.453, (1,2):2.967} 
>>> a[1,1] 
1.453 
>>> 'Values: {0[1,1]}'.format(a) 

Traceback (most recent call last): 
    File "<pyshell#66>", line 1, in <module> 
    'Values: {0[1,1]}'.format(a) 
KeyError: '1,1' 

Почему? Как я могу ссылаться на ключи кортежа в строке форматирования?

РАЗВЕЙТЕ

Кажется, мы не можем (см ответить ниже). Как быстро заметил agf, Python не может справиться с этим (надеюсь, что он будет реализован). В то же время, мне удалось обратиться к клавишам кортежа в строке формата со следующей обходной путь:

my_tuple=(1,1) 
b={str(x):a[x] for x in a} # converting tuple keys to string keys 
('Values: {0[%s]}'%(str(my_tuple))).format(b) # using the tuple for formatting 

ответ

6

Под Format String Syntax, field_name описан (курсив мой):

field_name сама по себе начинается с arg_name, который является либо номером , либо ключевым словом. Если это число, это относится к позиционному аргументу, и если это ключевое слово, оно относится к аргументу с именованным ключевым словом. Если числовые переменные arg_names в строке формата равны 0, 1, 2, ... в последовательности, все они могут быть опущены (а не только некоторые), а числа 0, 1, 2, ... будут автоматически вставлены в этот порядок , Потому что arg_name не является котировкой, невозможно указать произвольные словарные ключи (например, строки '10' или ':-]') в строке формата. За номером arg_name может следовать любое число выражений индекса или атрибута. Выражение формы '.name' выбирает именованный атрибут с использованием getattr(), тогда как выражение вида '[index]' выполняет поиск по индексу с использованием __getitem__().

Грамматика описывает arg_name как:

 
arg_name   ::= [identifier | integer] 

где identifier является:

 
identifier ::= (letter|"_") (letter | digit | "_")* 

Так tuple не является действительным arg_name как он не является ни identifier или integer, а может 't - произвольный словарь, потому что строковые ключи не цитируются.

+0

Ваша цитата говорит, что я не могу использовать «произвольную» строку, но «некоторые» строки могут использоваться как словарные ключи, как в моем первом примере. Итак, что означает «ключевое слово»? Только строка, которую нельзя интерпретировать как число? Тогда нет кортежей? Однако довольно странное ограничение. – mmj

+3

@mmj Это действительно сводится к тому, что Python должен решить, означает ли '1,1'' str'ing, ''1,1'' или' tuple', '(1, 1)'. Он делает более простую вещь и предполагает, что если это не целое число, это строка. – agf

Смежные вопросы