Python:将元组作为键的格式化字典

问题描述:

我想要打印字典的格式(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 

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