Python 在字典中嵌套的列表中循环

Python 在字典中嵌套的列表中循环,python,list,dictionary,for-loop,Python,List,Dictionary,For Loop,我有一个包含JSON结果的python字典。字典包含嵌套字典,嵌套字典包含嵌套字典的嵌套列表。还和我在一起吗?下面是一个例子: {'hits':{'results':[{'key1':'value1', 'key2':'value2', 'key3':{'sub_key':'sub_value'}}, {'key1':'value3',

我有一个包含JSON结果的python字典。字典包含嵌套字典,嵌套字典包含嵌套字典的嵌套列表。还和我在一起吗?下面是一个例子:

{'hits':{'results':[{'key1':'value1', 
                    'key2':'value2', 
                    'key3':{'sub_key':'sub_value'}},
                   {'key1':'value3',
                    'key2':'value4',
                    'key3':{'sub_key':'sub_value2'}}
                  ]}}
我想从字典中得到的是每个
sub\u键的
sub\u值
,并将其存储在不同的列表中。不管我怎么做,我总是会出错

这是我最后一次尝试:

inner_list=mydict['hits']['results']#This is the list of the inner_dicts

index = 0
    for x in inner_list:
        new_dict[index] = x[u'sub_key']
        index = index + 1

print new_dict
它打印了最初的几个结果,然后开始返回原始词典中的所有内容。我的头脑绕不过去。如果我用
print
语句替换
new\u dict[index]
行,它会完美地打印到屏幕上。真的需要一些意见

for x in inner_list:
    print x[u'sub_key']

x
是一本字典

在x的第一次迭代中…

x={'key1':'value1', 
                'key2':'value2', 
                'key3':{'sub_key':'sub_value'}},

请注意,在
x
中没有键
sub\u key
,而是在
x['key3']['sub\u key']
x
中是一个字典

>>> dic={'hits':{'results':[{'key1':'value1', 
                    'key2':'value2', 
                    'key3':{'sub_key':'sub_value'}},
                   {'key1':'value3',
                    'key2':'value4',
                    'key3':{'sub_key':'sub_value2'}}
                  ]}}
>>> inner_list=dic['hits']['results']
>>> [x[y]['sub_key'] for x in inner_list for y in x if isinstance(x[y],dict)]
['sub_value', 'sub_value2']
在x的第一次迭代中…

x={'key1':'value1', 
                'key2':'value2', 
                'key3':{'sub_key':'sub_value'}},
请注意,在
x
中没有键
sub\u key
,而是在
x['key3']['sub\u key']

>>> dic={'hits':{'results':[{'key1':'value1', 
                    'key2':'value2', 
                    'key3':{'sub_key':'sub_value'}},
                   {'key1':'value3',
                    'key2':'value4',
                    'key3':{'sub_key':'sub_value2'}}
                  ]}}
>>> inner_list=dic['hits']['results']
>>> [x[y]['sub_key'] for x in inner_list for y in x if isinstance(x[y],dict)]
['sub_value', 'sub_value2']
如果您确定是
key3
始终包含内部
dict
,则:

>>> [x['key3']['sub_key'] for x in inner_list]
['sub_value', 'sub_value2']
不使用
列表理解

>>> lis=[]
>>> for x in inner_list:
    for y in x:
        if isinstance(x[y],dict):
            lis.append(x[y]['sub_key'])


>>> lis
['sub_value', 'sub_value2']
如果您确定是
key3
始终包含内部
dict
,则:

>>> [x['key3']['sub_key'] for x in inner_list]
['sub_value', 'sub_value2']
不使用
列表理解

>>> lis=[]
>>> for x in inner_list:
    for y in x:
        if isinstance(x[y],dict):
            lis.append(x[y]['sub_key'])


>>> lis
['sub_value', 'sub_value2']

在作出一些假设之后:

[e['key3']['sub_key'] for e in x['hits']['results']]
要更改每个实例,请执行以下操作:

for e in x['hits']['results']:
 e['key3']['sub_key'] = 1

在作出一些假设之后:

[e['key3']['sub_key'] for e in x['hits']['results']]
要更改每个实例,请执行以下操作:

for e in x['hits']['results']:
 e['key3']['sub_key'] = 1

索引错误来自
new\u dict[index]
,其中
index
大于
new\u dict
的大小

应考虑列表理解。这通常更好,但有助于理解这在循环中是如何工作的。试试这个

new_list = []
for x in inner_list:
    new_list.append(x[u'sub_key'])

print new_list
如果您想坚持使用dict,但使用索引作为键,请尝试以下操作:

index = 0
new_dict = {}
    for x in inner_list:
        new_dict[index] = x[u'sub_key']
        index = index + 1

print new_dict
好的,根据你下面的评论,我想这就是你想要的

inner_list=mydict['hits']['results']#This is the list of the inner_dicts

new_dict = {}
for x in inner_list:
    new_dict[x['key2']] = x['key3']['sub_key']

print new_dict

索引错误来自
new\u dict[index]
,其中
index
大于
new\u dict
的大小

应考虑列表理解。这通常更好,但有助于理解这在循环中是如何工作的。试试这个

new_list = []
for x in inner_list:
    new_list.append(x[u'sub_key'])

print new_list
如果您想坚持使用dict,但使用索引作为键,请尝试以下操作:

index = 0
new_dict = {}
    for x in inner_list:
        new_dict[index] = x[u'sub_key']
        index = index + 1

print new_dict
好的,根据你下面的评论,我想这就是你想要的

inner_list=mydict['hits']['results']#This is the list of the inner_dicts

new_dict = {}
for x in inner_list:
    new_dict[x['key2']] = x['key3']['sub_key']

print new_dict

您忘记了嵌套的级别

for x in inner_list:
    for y in x:
        if isinstance(x[y], dict) and 'sub_key' in x[y]:
            new_dict.append( x[y]['sub_key'] )

您忘记了嵌套的级别

for x in inner_list:
    for y in x:
        if isinstance(x[y], dict) and 'sub_key' in x[y]:
            new_dict.append( x[y]['sub_key'] )


请张贴错误的输出。这个程序看起来是正确的,所以我觉得我不明白它在做什么,这与你的想法相反expect@inspectorG4dget只是在那里运行了完全相同的代码,并在main newresults[index]=x[u'sub_key'中得到了回溯错误
文件“C:\Python27\test.py”,第24行索引器:列表分配索引超出范围
如果
新结果
是您发布的
新目录
并且是一个
列表
,则尝试向其添加
附加
,而不是分配给尚未存在的索引请发布错误输出。这个程序看起来是正确的,所以我觉得我不明白它在做什么,这与你的想法相反expect@inspectorG4dget只是在那里运行了完全相同的代码,并在main newresults[index]=x[u'sub_key'中得到了回溯错误
文件“C:\Python27\test.py”,第24行索引器:列表分配索引超出范围
如果
newresults
是您发布的
new\u dict
并且是
列表
,那么请尝试
追加
到它,而不是分配到一个还不存在的索引。为什么,当我打印x['sub\u key']时,它打印没有问题?它不适合我。。。它在内部为x引发了一个错误“>>>:。。。打印x[u'sub_key']。。。回溯(最近一次调用last):文件“”,第2行,在KeyError:u'sub_key'`从sub_key前面移除u sorrynope。。。还是没有。。。在你不包括的中间列表中有一些你正在做的事情…x没有“子_键”。。。。只有x['key3']有'sub_key',因为print语句对我很有效,所以我必须更改代码中的某些内容!但是感谢您的输入为什么,当我打印x['sub_key']时,它打印没有问题?它不适合我。。。它在内部为x引发了一个错误“>>>:。。。打印x[u'sub_key']。。。回溯(最近一次调用last):文件“”,第2行,在KeyError:u'sub_key'`从sub_key前面移除u sorrynope。。。还是没有。。。在你不包括的中间列表中有一些你正在做的事情…x没有“子_键”。。。。只有x['key3']有'sub_key',因为print语句对我很有效,所以我必须更改代码中的某些内容!但是谢谢你的输入哇,真是太多了!我对自己一点也不放松!非常感谢!正如我对Marco所说的,我仍然处于C编程模式,因此python语法对我来说仍然有点奇怪。谢谢。是的,对于一个新的python程序员来说,列表理解是很难理解的,所以我添加了一个简单版本的答案(不使用列表理解)哇,真是太好了!我对自己一点也不放松!非常感谢!正如我对Marco所说的,我仍然处于C编程模式,因此python语法对我来说仍然有点奇怪。谢谢。是的,对于一个新的python程序员来说,列表理解是很难理解的,所以我添加了一个简单版本的答案(不使用列表理解),谢谢。我一开始是C程序员,所以我发现python语法仍然很奇怪。如果我想改变子键的值呢?如将sub_值更改为sub_值_y@adohertyd:例如
x['hits']['results'][0]['key3']['sub_key']=y
在每个实例中更改它怎么样?就像在循环中一样?非常感谢这让生活变得更美好