有python嵌套字典的问题

时间:2017-03-29 17:25:08

标签: python-2.7

我遇到了一些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

非常感谢任何帮助

2 个答案:

答案 0 :(得分:1)

您只需删除嵌套OrderedDict周围的括号,即

OrderedDict([..., (u'records', OrderedDict([...]))])

而不是

OrderedDict([..., (u'records', [OrderedDict([...])])])

这是因为OrderedDict期望其参数是键值对的列表。在您的代码中,键'records'的值是包含单个字典的列表。你希望它只是一本字典。

编辑:由于您无法更改用于构建字典的数据,因此有几种解决方法。

解决方法#1

忍受更烦人的呼叫方案:

d['records'][0]['Name']

这是一种更简单的解决方法,但当然它很难理解。

解决方法#2

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作为变量名称可能不是一个好主意,因为它是内置字典类型的名称。将其用于其他内容可能会导致后续代码中的意外错误(当您想要创建字典但最终调用其他内容时)。这不是您的问题索引数据结构的原因,只是一种改进代码的方法。