使用字典和复合字段格式(),将Integer键存储为String

时间:2012-07-26 04:47:40

标签: python string dictionary

如果字典的整数键存储为字符串 {'0': 'foo'},您如何使用.format()Compound Field Names中引用该字符?

我认为它可能是非pythonic (以及糟糕的编程)来获得带有这些键的dict ......但在这种情况下,它也不可能以这种方式使用:

>>> a_dict = {0: 'int zero',
...           '0': 'string zero',
...           '0start': 'starts with zero'}
>>> a_dict
{0: 'int zero', '0': 'string zero', '0start': 'starts with zero'}
>>> a_dict[0]
'int zero'
>>> a_dict['0']
'string zero'
>>> " 0  is {0[0]}".format(a_dict)
' 0  is int zero'
>>> "'0' is {0['0']}".format(a_dict)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: "'0'"
>>> "'0start' is {0[0start]}".format(a_dict)
"'0start' is starts with zero"

{0[0]}.format(a_dict)总是会引用密钥int 0,即使没有密钥,所以至少这是一致的:

>>> del a_dict[0]
>>> a_dict
{'0': 'string zero', '0start': 'starts with zero'}
>>> "{0[0]}".format(a_dict)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: 0L

(是的,我知道如果需要我可以'%s' % a_dict['0']。)

3 个答案:

答案 0 :(得分:3)

你做不到。您需要传入一个额外的参数来格式化。

>>> "'0' is {0[0]} {1}".format(a_dict, a_dict['0'])

答案 1 :(得分:3)

str.format,不像例如"f-strings",不使用完整的解析器。提取 grammar 的相关位:

replacement_field ::=  "{" [field_name] ["!" conversion] [":" format_spec] "}"
field_name        ::=  arg_name ("." attribute_name | "[" element_index "]")*
element_index     ::=  digit+ | index_string
index_string      ::=  <any source character except "]"> +

被方括号包围的 field_name 是一个 element_index,它是:

  1. 一个或多个数字(digit+,例如 0 - 但前提是它们是all 数字,这就是为什么 0start 属于第二种情况);或
  2. 一系列“除“]”之外的任何源字符

因此对于 0['0']field_name"'0'"不是 '0'

<块引用>

... 形式为 '[index]' 的表达式使用 __getitem__()

对于 "'0' is {0['0']}".format(a_dict),替换为 a_dict.__getitem__("'0'"),语法中无法选择实际的 a_dict['0']

答案 2 :(得分:1)

编辑:我发现了问题。它使用字符串“'0'”调用dict。 getitem ,而不是按预期调用“0”。因此这是不可能的。遗憾。