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所指出的那样。

4

4 回答 4

14

不,根据文档

因为 arg_name 不是用引号分隔的,所以不可能在格式字符串中指定任意字典键(例如,字符串 '10' 或 ':-]')。

所以你不能使用由数字组成的字符串作为格式字符串中的字典键。

请注意,您的键不是数字的,也没有尝试将其用作列表索引。您的密钥是一个恰好包含数字字符的字符串。它试图做的是使用数字 1(不是字符串“1”)作为字典键。如果您使用数字 1 作为字典键(即,使您的 dict {'key1': 'val1', 1: 'val2'}),它将起作用。

于 2012-06-21T02:38:05.107 回答
8

我认为您正在寻找的是:

dictionary = {'key1': 'val1', '1': 'val2'}
string2 = 'Interpolating {key1}'.format(**dictionary)
print string2
于 2017-04-07T14:14:27.897 回答
-1

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

string2 = 'Interpolating {somevar}'.format(whateverhere..., somevar=dictionary['1'])
于 2012-06-21T02:45:55.727 回答
-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
于 2017-10-24T17:30:24.490 回答