Python 在遍历包含嵌套字典和列表的字典列表时,如何选择特定值?

Python 在遍历包含嵌套字典和列表的字典列表时,如何选择特定值?,python,json,dictionary,Python,Json,Dictionary,我试图在遍历包含嵌套字典和列表的字典列表时获取特定值 这大致就是我导入的json数据的样子(简化)。这是一个包含嵌套字典和嵌套列表的字典列表 # What a single dictionary looks like prettified [{ 'a':'1', 'b':'2', 'c':'3', 'd':{ 'ab':'12', 'cd':'34', 'ef':'56'}, 'e':['test', 'list'], 'f':'etc...' }] # What t

我试图在遍历包含嵌套字典和列表的字典列表时获取特定值

这大致就是我导入的json数据的样子(简化)。这是一个包含嵌套字典和嵌套列表的字典列表

# What a single dictionary looks like prettified

[{ 'a':'1',
'b':'2',
'c':'3',
'd':{ 'ab':'12',
      'cd':'34',
      'ef':'56'},
'e':['test', 'list'],
'f':'etc...'
}]

# What the list of dictionaries looks like

dict_list = [{ 'a':'1', 'b':'2', 'c':'3', 'd':{ 'ab':'12','cd':'34', 'ef':'56'}, 'e':['test', 'list'], 'f':'etc...'}, { 'a':'2', 'b':'3', 'c':'4', 'd':{ 'ab':'23','cd':'45', 'ef':'67'}, 'e':['test2', 'list2'], 'f':'etcx2...'},{},........,{}]
这是我最初使用的代码,它只遍历字典列表

for dic in dict_list:
    for val in dic.values():
        if not isinstance(val, dict):
            print(val)
        else:    
            for val2 in val.values():
                print (val2)
上面我的原始代码中的print语句只是为了向我展示从字典列表中提取的内容。我想做的是声明我希望从顶级和二级字典和列表中获取哪些值

下面是我作为一个例子寻找的输出

列表中每个顶级字典的第一个键的值

top_level_dict_key1 = ['1','2']
2级词典的所有值

level2_dic = ['12', '34', '56', '23', '45', '67']
或特定值。在本例中,每个嵌套字典中第一个键的值

level2_dict = ['12', '23']
嵌套列表中第二个键的值

level2_list = ['test', 'test2']

希望这是清楚的。如果您也需要我,我会尽力澄清。

了解Python 3.6的具体实现,但依赖这种行为是不好的。除非它是有序的,否则询问它的“第一个元素”是没有意义的,所以第一步是

那么,这只是一个仔细记账的问题。e、 g

import json                                                                     
from collections import OrderedDict                                             

dict_list = '[{ "a":"1", "b":"2", "c":"3", "d":{ "ab":"12","cd":"34", "ef":"56"}, "e":["test", "list"], "f":"etc..."}, { "a":"2", "b":"3", "c":"4", "d":{ "ab":"23"    ,"cd":"45", "ef":"67"}, "e":["test2", "list2"], "f":"etcx2..."}]'

dict_list = json.loads(dict_list, object_pairs_hook=OrderedDict)    
top_level_dict_key1 = []
level2_dic = []
level2_dict = []
level2_list = []
for dictionary in dict_list:
    top_level_dict_key1.append(list(dictionary.values())[0])
    for value in dictionary.values():
        if isinstance(value, OrderedDict):
            level2_dic.extend(list(value.values()))
            level2_dict.append(list(value.values())[0])
        elif isinstance(value, list):
            level2_list.append(value[0])

print(top_level_dict_key1)
print(level2_dic)
print(level2_dict)
print(level2_list)
输出:

['1', '2']
['12', '34', '56', '23', '45', '67']
['12', '23']
['test', 'test2']

(这可能不是最惯用的Python 3代码。我会在不太累的时候编辑一些更好的代码。)

了解Python 3.6的具体实现,但依赖这种行为并不好。除非它是有序的,否则询问它的“第一个元素”是没有意义的,所以第一步是

那么,这只是一个仔细记账的问题。e、 g

import json                                                                     
from collections import OrderedDict                                             

dict_list = '[{ "a":"1", "b":"2", "c":"3", "d":{ "ab":"12","cd":"34", "ef":"56"}, "e":["test", "list"], "f":"etc..."}, { "a":"2", "b":"3", "c":"4", "d":{ "ab":"23"    ,"cd":"45", "ef":"67"}, "e":["test2", "list2"], "f":"etcx2..."}]'

dict_list = json.loads(dict_list, object_pairs_hook=OrderedDict)    
top_level_dict_key1 = []
level2_dic = []
level2_dict = []
level2_list = []
for dictionary in dict_list:
    top_level_dict_key1.append(list(dictionary.values())[0])
    for value in dictionary.values():
        if isinstance(value, OrderedDict):
            level2_dic.extend(list(value.values()))
            level2_dict.append(list(value.values())[0])
        elif isinstance(value, list):
            level2_list.append(value[0])

print(top_level_dict_key1)
print(level2_dic)
print(level2_dict)
print(level2_list)
输出:

['1', '2']
['12', '34', '56', '23', '45', '67']
['12', '23']
['test', 'test2']


(这可能不是最惯用的Python 3代码。当我不太累的时候,我会编辑一些更好的代码。)

什么版本的Python?在3.7之前,字典不保证有任何特定的顺序。(顺便说一句,好的问题应该能够独立存在。如果你可以编辑它,使其有意义,而不参考你以前的问题,那么任何试图帮助你的人都会更容易。)目前是Python3.6,但我可以在项目的这一部分使用3.7运行环境。项目的其余部分将是深入学习,因此3.7可能不是一个好主意。@JETM我发布的内容几乎就是我其他问题的全部内容。我回去编辑了这篇文章,但是没有太多新的信息。我有什么遗漏,你需要澄清吗?我很乐意为您效劳。您前面提到的问题令人困惑。我看不出一个明确的问题。你能删除所有关于以前有过这个问题的引用吗?Python的哪个版本?在3.7之前,字典不保证有任何特定的顺序。(顺便说一句,好的问题应该能够独立存在。如果你可以编辑它,使其有意义,而不参考你以前的问题,那么任何试图帮助你的人都会更容易。)目前是Python3.6,但我可以在项目的这一部分使用3.7运行环境。项目的其余部分将是深入学习,因此3.7可能不是一个好主意。@JETM我发布的内容几乎就是我其他问题的全部内容。我回去编辑了这篇文章,但是没有太多新的信息。我有什么遗漏,你需要澄清吗?我很乐意为您效劳。您前面提到的问题令人困惑。我看不出一个明确的问题。你能删除所有关于以前有过这个问题的引用吗?虽然我的示例数据似乎是有序的,但实际数据不是,对于这个项目来说,这并不一定重要,因为数据确实没有顺序,但我明白你的意思。我只是尝试了一下代码,但我得到了一个
TypeError:“dict_values”对象不支持索引
错误。这是Python 3.6的问题吗?@MixedBeans啊,我的错。我在2.7中测试。您必须先将
.values()
强制转换为列表,然后才能对其进行索引。或者查看答案以避免创建您不需要的列表。谢谢。我尝试了一下这段代码,意识到我忘了使用OrderedDict。我试图实现它,但我会得到一个错误<代码>类型错误:“对象\u对\u挂钩”是此函数的无效关键字参数。下面是我之前加载json的方式<代码>以open('test.json','r')作为f:json_text=f.read()dict_list=json.loads(json_text)我尝试用open删除,然后使用
dict_list=json.loads(open('test.json'))
加载,这似乎很好,但当我添加
对象对\u hook=OrderedDict
作为json.loadc的参数时,正如我在其他例子中看到的,我得到TypeError@MixedBeans呃。。。仔细检查是否正在将其传递给
json。是否加载
而不是
open
/拼写正确?我只是仔细检查了一下,它肯定在那里。虽然我的样本数据看起来是有序的,但实际数据不是,对于这个项目来说,这并不一定重要,因为数据确实没有顺序,但我明白你的意思。只是尝试了一下代码,但我得到了一个
类型错误:“dict_values”对象不支持索引
错误。这是Python 3.6的问题吗?@MixedBeans啊,我的错。我在2.7中测试。您必须先将
.values()
强制转换为列表,然后才能对其进行索引。或者查看答案以避免创建您不需要的列表。谢谢。我尝试了一下这段代码,意识到我忘了使用OrderedDict。我试图实现它,但我会得到一个错误<代码>类型错误:“对象\u对\u挂钩”是此函数的无效关键字参数
。下面是我之前加载json的方式<代码>以open('test.json','r')作为f:json_text=f.read()dict_list=json.loads(json_text)
我尝试用op删除