【问题标题】:Looping through a list nested in a dictionary遍历嵌套在字典中的列表
【发布时间】:2012-07-09 04:16:57
【问题描述】:

我有一个包含 JSON 结果的 python 字典。该字典包含一个嵌套字典,其中包含一个包含嵌套字典的嵌套列表。还在我这儿?这是一个例子:

{'hits':{'results':[{'key1':'value1', 
                    'key2':'value2', 
                    'key3':{'sub_key':'sub_value'}},
                   {'key1':'value3',
                    'key2':'value4',
                    'key3':{'sub_key':'sub_value2'}}
                  ]}}

我想从字典中得到每个sub_keysub_vale 并将其存储在不同的列表中。无论我尝试什么,我都会不断出错。

这是我最后一次尝试:

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_dict[index] 行,它会完美地打印到屏幕上。真的需要一些意见!

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

【问题讨论】:

  • 请张贴错误的输出。该程序看起来是正确的,所以我感觉我不明白它在做什么,这与您的预期相反
  • @inspectorG4dget 刚刚在那里运行了确切的代码并得到了回溯错误File "C:\Python27\test.py", line 24, in main newresults[index] = x[u'sub_key'] IndexError: list assignment index out of range
  • 如果newresults 是您发布为new_dict 的内容并且是list,那么尝试appending 给它,而不是分配给一个还没有的索引存在

标签: python list dictionary for-loop


【解决方案1】:

做了一些假设后:

[e['key3']['sub_key'] for e in x['hits']['results']]

更改每个实例:

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

【讨论】:

  • 谢谢,就是这样。我最初是一名 C 程序员,所以我发现 python 语法仍然很奇怪。如果我想更改子键的值怎么办?如将 sub_value 更改为 sub_value_y
  • @adohertyd :例如x['hits']['results'][0]['key3']['sub_key'] = y
  • 在每个实例中更改它怎么样?在循环中?
  • 非常感谢,这让我的生活更轻松了
【解决方案2】:

x 是字典

for x in ...的第一次迭代

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

请注意,x 中没有键 sub_key,而是在 x['key3']['sub_key']

【讨论】:

  • 为什么,当我执行print x['sub_key'] 时,打印没有问题?
  • 它不适合我...它引发错误` >>> for x in inner: ... print x[u'sub_key'] ... Traceback(最近一次调用最后): 中的文件“”第 2 行 KeyError: u'sub_key'`
  • 去掉 sub_key 前面的 u 抱歉
  • 不...仍然没有...显然您正在对中间的内部列表做一些您不包括在内的事情... x 没有键 'sub_key' .... 只有x['key3'] 有 'sub_key'
  • 我必须更改代码中的某些内容,因为 print 语句对我有用!但是感谢您的输入
【解决方案3】:

您忘记了嵌套级别。

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'] )

【讨论】:

    【解决方案4】:
    >>> 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']
    

    如果您确定始终包含内部dict 的是key3,那么:

    >>> [x['key3']['sub_key'] for x in inner_list]
    ['sub_value', 'sub_value2']
    

    不使用List comprehensions:

    >>> 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']
    

    【讨论】:

    • 哇,那是一口!我自己一点也不轻松!
    • 非常感谢!正如我对 Marco 所说,我仍然处于 C 编程模式,所以 python 语法对我来说仍然有点奇怪。谢谢。
    • 是的,对于新的 python 程序员来说,列表理解有点难以理解,所以我添加了一个简单版本的答案(不使用列表理解)
    【解决方案5】:

    索引错误来自new_dict[index],其中index大于new_dict的大小。

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

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

    如果你想坚持使用字典,但使用索引作为键,试试这个:

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

    好的,根据您下面的 cmets,我认为这就是您想要的。

    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
    

    【讨论】:

    • 是的,它是一个更大程序的一部分,我从 3 个字典中获取特定元素,将它们放入列表并根据特定标准进行比较。从我认为的列表中更容易做到这一点
    • 如果我想从原始字典的一些元素创建字典怎么办。我该怎么做呢?
    • 实际上与您代码中的语法非常相似,但您需要一个字符串作为键。 new_dict[key] = 值。您想为键使用什么元素,为值使用哪个元素。
    • 我们会说我想用key2sub_key 创建一个新字典,而忽略其余部分
    • key2 是静态值还是会改变?如果你想要一个 dict 中的第二个元素,因为 dicts 是无序的......
    猜你喜欢
    • 2015-12-06
    • 1970-01-01
    • 2021-03-19
    • 2020-11-13
    • 1970-01-01
    • 2017-07-25
    相关资源
    最近更新 更多