【问题标题】:Within a list of dicts, processing all key-value pairs per iteration在字典列表中,每次迭代处理所有键值对
【发布时间】:2019-11-08 22:21:50
【问题描述】:

无法解析字典列表、访问每个字典的所有键值对、通过循环以一次处理每个 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

代码有问题,我还不知道如何实现上面的,可能很简单但我还没有找到。

【问题讨论】:

  • 您的数据和代码中存在多个语法错误。请发布您实际测试过的代码。
  • 无论如何,假设对您的帖子进行了合理的修复,result_list 是一个列表列表,其中包含每个字典中的值。列表没有 items 方法。如果你想迭代它,只需删除 .items()
  • 字典中的'c'元素没有被:分隔;你有你一直在使用的代码吗?
  • 谢谢!是的,有些错误,我做了更正,但使用的数据和代码几乎是原件的精确副本。代码是一对一的。
  • 那么,您了解错误消息的含义吗?因为如果你知道一些 Python 词汇,它们就很清楚了。如果没有,你不明白什么?

标签: python json list loops dictionary


【解决方案1】:

您应该能够加载整个列表而无需使用 json.load 重建它,然后迭代它和 dicts

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 文件,因为每个 dict 中的第一个键/值似乎应该是一个 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)

【讨论】:

  • 据我所知,输入是一个 JSON 对象数组,而不是每行一个对象的文件。
  • 是的,我意识到了,正在修复
【解决方案2】:
    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

【讨论】:

  • 谢谢,这实际上工作得很好,这正是我试图做的。非常感谢!
【解决方案3】:

你的问题的第一部分是在你的枚举调用中:

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

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

回答你的第二个问题:

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

考虑双重解引用。

【讨论】:

    猜你喜欢
    • 2018-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2013-07-01
    • 2019-02-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多