在字典列表中,每次迭代处理所有键值对

时间:2019-06-26 22:46:05

标签: python json list loops dictionary

难以解析字典列表,无法通过循环访问每个词典的所有键值对,以便一次处理每个k-v。

我有一个包含字典列表的json文件。 简化形式:

[
{"": "0", "a": "3893", "b": "2389", "c": "1209"}, 
{"": "1", "a": "4308", "b": "4560", "c": "9127"},
... 
] 

我想遍历每个字典,并针对每个键-值对(不包括第一个,假设由于键为空而将其跳过)在每次迭代中循环访问a,b,c kv对一个字典,以便对其进行单独处理。

我尝试过:

import json

with open("file.json", "r") as read_file:
    data = json.load(read_file)

    result_list = []
    for d in data:
        result_list.append([v for k,v in d.items()])

    for k, v in enumerate(result_list.items()): 
        # process each key-value pair

但是出现以下错误:

Traceback (most recent call last):
  File "somescript.py", line 28, in <module>
    for k, v in enumerate(result_list.items()): 
AttributeError: 'list' object has no attribute 'items'

与此同时,我尝试:

import json

with open("file.json", "r") as read_file:
data = json.load(read_file)

for i in data:
    print(i, data[i])

并获取:

  Traceback (most recent call last):
  File "somescript.py", line 26, in <module>
    print(i, dat[i])
TypeError: list indices must be integers or slices, not dict

代码有错误,我尚不知道如何实现上述目标,这可能很简单,但我尚未找到它。

3 个答案:

答案 0 :(得分:1)

问题的第一部分是在枚举呼叫中

    for k, v in enumerate(result_list): # take off the .items())
        # process each key-value pair

您不要在result_list上调用.items();枚举将其作为列表使用。

回答第二个问题:

import json

with open("file.json", "r") as read_file:
data = json.load(read_file)

for i in data:
    print(i, data[i])

假设json是您一直在使用的词典列表,则需要:

for item in data:
    for key in item:
        print(key, item[key])

考虑双重引用。

答案 1 :(得分:0)

您应该能够仅使用json.load加载整个列表而无需重建列表,然后遍历列表和字典

import json

with open("file.json", "r") as read_file:
    data = json.load(read_file)

for d in data:
    for i, (k, v) in enumerate(d.items()):
        print(i, k, v)

那是说我建议您将文件另存为普通的JSON文件,因为每个字典中的第一个键/值似乎应该是一个ID字段,因此应如下所示:

{  
    "0": {
        "a":"3893",
        "b":"2389",
        "c":"1209"
    },
    "1": {
        "a":"4308",
        "b":"4560",
        "c":"9127"
    }
}

您可以使用dict理解来做到这一点:

with open("file.json", 'w') as out_file:
    json.dump({d.pop(""): d for d in data}, out_file, indent=4)

然后您要做的就是简单地遍历字典:

with open("file.json", "r") as read_file:
    data = json.load(read_file)

    for _id, item in data.items():
        for k, v in item.items():
            print(_id, k, v)

答案 2 :(得分:0)

    result_list = []
    for d in data:
        result_list.append([v for k,v in d.items()])

这将创建一个列表列表。请注意,执行此操作时,将丢弃字典中的键。这可能不是您想要的。

    for k, v in enumerate(result_list.items()): 
        # process each key-value pair

您在这里遇到错误,因为result_list是列表,而不是字典。列表没有名为items()的方法。

我建议您直接迭代data。不需要result_list

for d in data:
    for k, v in d.items():
        # process each key-value pair