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 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
,并能不是任意的字典键,因为字符串键不被引用。
您的引用说我不能使用“任意”字符串,但“一些”字符串可以用作字典键,如我的第一个示例中。那么“关键字”是什么意思?只有一个不能被解释为数字的字符串?没有元组呢?虽然很奇怪的限制。 – mmj 2012-04-10 22:42:30
@mmj这真的归结为Python必须决定'1,1'是指'str'ing,''1,1''还是'tuple',(1,1)'这一事实。它做更简单的事情,并假设它不是一个整数,它是一个字符串。 – agf 2012-04-10 22:46:23