我遇到了一些python的新手问题,尽管我在网上看过所有的建议,但我无法访问我试图访问的列出词典中的值。
这是API返回的数据:
OrderedDict([(u'totalSize', 1), (u'done', True), (u'records', [OrderedDict([(u'attributes', OrderedDict([(u'type', u'Contact'), (u'url', u'/services/data/v29.0/sobjects/Contact/00346000004eV89AAE')])), (u'Name', u'This is my name')])])])
这是我最近的尝试:
dict['records']['Name']
print(dict['records']['Name'])
TypeError: list indices must be integers, not str
非常感谢任何帮助
答案 0 :(得分:1)
您只需删除嵌套OrderedDict
周围的括号,即
OrderedDict([..., (u'records', OrderedDict([...]))])
而不是
OrderedDict([..., (u'records', [OrderedDict([...])])])
这是因为OrderedDict
期望其参数是键值对的列表。在您的代码中,键'records'
的值是包含单个字典的列表。你希望它只是一本字典。
编辑:由于您无法更改用于构建字典的数据,因此有几种解决方法。
忍受更烦人的呼叫方案:
d['records'][0]['Name']
这是一种更简单的解决方法,但当然它很难理解。
将OrderedDict
换行到一个自定义项目访问语法的新类中。
class MyOrderedDict(OrderedDict):
def __getitem__(self, key):
ret = super().__getitem__(key)
if isinstance(ret, list):
if ret and isinstance(ret[0], OrderedDict):
return ret[0]
return ret
这使得如果像d['records']
这样的调用的返回值是第一个元素是OrderedDict
的列表,那么将返回OrderedDict
而不是列表,所以你可以链接项目访问。你会这样写:
d = MyOrderedDict(api_data)
d['records']['Name'] # 'This is my name'
答案 1 :(得分:1)
您从API获得的数据结构包含一个字典列表dict['records']
。你似乎在期待那里的字典。
由于列表只有一个元素,您可能只需要对列表编制索引即可获得所需的值:dict['records'][0]['name']
。
但是,如果列表中可能存在不同数量的内部词典,则可能需要编写列表推导(或显式循环)。尝试类似[inner['name'] for inner in dict['records']]
的内容。这将为您提供一个名称列表,其中包含与dict['records']
列表相同的项目数。
请注意,在代码中使用dict
作为变量名称可能不是一个好主意,因为它是内置字典类型的名称。将其用于其他内容可能会导致后续代码中的意外错误(当您想要创建字典但最终调用其他内容时)。这不是您的问题索引数据结构的原因,只是一种改进代码的方法。