字符串格式化 [str.format()] 中的字典键是数字的 str() 形式

15

我是一名Python初学者。我想知道有没有人可以帮助我解决在使用字典进行字符串插值时出现的KeyError问题,该问题发生在str.format中。

dictionary = {'key1': 'val1', '1': 'val2'}

string1 = 'Interpolating {0[key1]}'.format(dictionary)
print string1

上述代码运行正常,输出结果为:
Interpolating val1

然而,执行以下操作:

dictionary = {'key1': 'val1', '1': 'val2'}

string2 = 'Interpolating {0[1]}'.format(dictionary)
print string2

结果为:

Traceback (most recent call last):
  File "test.py", line 3, in <module>
    string2 = 'Interpolating {0[1]}'.format(dictionary)
KeyError: 1L

因此,在我看来,问题似乎在于将数字键解释为列表索引。有没有什么办法可以解决这个问题?(即表明这实际上是一个字典键)

TIA,如果这个问题以前被问过而我没有找到任何相关的东西,那么请原谅我的搜索技巧不够好。

编辑1:正如BrenBarn所指出的那样,该键不是数字,而是一个数字的字符串表示形式。


你不想这样做的原因是什么:string2 = 'Interpolating {}'.format(dictionary['1']) - KobeJohn
1
使用 format 的常规方式是 '插值 {key1}'。format(**dictionary) - John La Rooy
kobejohn:在我使用插值的上下文中,按照问题中讨论的方式进行操作是最为便捷的。因为我随后会使用它来访问一个属性(例如 '{0[1].some_attr}'.format({'1' : someobj}))。 - decimus phostle
只是为了确保事情清楚,正如BrenBarn所指出的那样,您的示例未使用数字键。它使用字符串“'1'”作为键。您将不得不将字典更改为{1:someobj}。 - KobeJohn
kobejohn: 确定。我已更新问题/描述。如果有的话,仍在征求解决插值字典中将数字的字符串表示用作键的问题的解决方法。 - decimus phostle
我没有看到任何未解决的问题。按照你想要使用的方式将字符串作为键:不起作用。按照你想要使用的方式使用数字:可以。还有其他需要回答的吗? - KobeJohn
4个回答

14

不行。根据文档

 

因为arg_name没有引号包围,所以无法在格式字符串中指定任意字典键(例如字符串“10”或“:-]”)。

因此,您不能在格式字符串中使用由数字组成的字符串作为字典键。

请注意,您的键不是数字,并且它并没有尝试将其用作列表索引。您的键是一个包含数字字符的字符串。它试图做的是使用数字1(而不是字符串“1”)作为字典键。如果您使用数字1作为字典键(即使您的字典为{'key1':'val1',1:'val2'}),则可以正常工作。


在发布之前,我已经阅读了文档和PEP(http://www.python.org/dev/peps/pep-3101/)。然而,我想知道Python大师是否有任何提示/建议/解决方法。看来没有。另外,你是对的 - 关键字是字符串而不是数字。傻瓜! - decimus phostle

9
我认为您要找的是:

我想您正在寻找以下内容:

dictionary = {'key1': 'val1', '1': 'val2'}
string2 = 'Interpolating {key1}'.format(**dictionary)
print string2

对于使用字典为格式化命令提供值的更一般的问题,最简单且最有效的答案是使用加号一。 - Thomas Kimber

-1

你说得对 - 解析器并不是很复杂,无法处理字典的变量下标。你的解决方法是:

string2 = 'Interpolating {somevar}'.format(whateverhere..., somevar=dictionary['1'])

-1
如果你的字典键是字符串,一个可能的解决方法是将你的字典转换为一个类:
class ClassFromDict:
    def __init__ (self, dct) :
        for key in dct.keys():
            self.__dict__[key] = dct[key]

dictionary = {'key1': 'val1', '1': 'val2'}
classfromdict = ClassFromDict(dictionary)

string1 = 'Interpolating {0.key1}'.format(classfromdict)
print string1
string2 = 'Interpolating {0.1}'.format(classfromdict)
print string2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接