我想格式化用于打印的字典(Python 2.7.3),并且字典将元组作为键。使用其他类型的键我可以做
>>> 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
答案 0 :(得分: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
,也不能是任意字典键,因为字符串键不是引用了。