2

印刷用に辞書をフォーマットしたいのですが(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
4

1 に答える 1

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で:

識別子::=(文字| "_")(文字|数字| "_")*

したがって、aはanでもtupleaでもないため有効ではなく、文字列キーは引用符で囲まれていないため、任意の辞書キーにすることはできません。arg_nameidentifierinteger

于 2012-04-10T22:18:08.373 に答える