2012-04-10 113 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 Syntaxfield_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,因爲它既不是identifierinteger,並能不是任意的字典鍵,因爲字符串鍵不被引用。

+0

您的引用說我不能使用「任意」字符串,但「一些」字符串可以用作字典鍵,如我的第一個示例中。那麼「關鍵字」是什麼意思?只有一個不能被解釋爲數字的字符串?沒有元組呢?雖然很奇怪的限制。 – mmj 2012-04-10 22:42:30

+3

@mmj這真的歸結爲Python必須決定'1,1'是指'str'ing,''1,1''還是'tuple',(1,1)'這一事實。它做更簡單的事情,並假設它不是一個整數,它是一個字符串。 – agf 2012-04-10 22:46:23