首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在字典列表中,每次迭代处理所有键-值对

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

Stack Overflow用户
提问于 2019-06-27 06:46:06
回答 3查看 54关注 0票数 0

在解析字典列表、通过循环访问每个字典的所有键值对以便一次处理每个k-v时遇到困难。

我有一个由字典列表组成的json文件。简而言之:

代码语言:javascript
复制
[
{"": "0", "a": "3893", "b": "2389", "c": "1209"}, 
{"": "1", "a": "4308", "b": "4560", "c": "9127"},
... 
] 

我想在每个字典中循环这个,并且对于每个键-值对(不包括第一个键,假设它将被跳过,因为键是空的),可以访问一个dict的a,b,c,k-v对,以便单独处理它们。

我试过了:

代码语言:javascript
复制
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

但我得到以下错误:

代码语言:javascript
复制
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'

与此同时,我试着:

代码语言:javascript
复制
import json

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

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

并获取:

代码语言:javascript
复制
  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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-27 07:21:59

代码语言:javascript
复制
    result_list = []
    for d in data:
        result_list.append([v for k,v in d.items()])

这将创建一个列表列表。请注意,当您这样做时,您正在丢弃字典中的关键字。这可能不是您想要的。

代码语言:javascript
复制
    for k, v in enumerate(result_list.items()): 
        # process each key-value pair

这里会出现一个错误,因为result_list是一个列表,而不是一个字典。列表没有名为items()的方法。

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

代码语言:javascript
复制
for d in data:
    for k, v in d.items():
        # process each key-value pair
票数 0
EN

Stack Overflow用户

发布于 2019-06-27 07:11:41

问题的第一部分存在于枚举调用中:

代码语言:javascript
复制
    for k, v in enumerate(result_list): # take off the .items())
        # process each key-value pair

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

回答你的第二个问题:

代码语言:javascript
复制
import json

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

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

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

代码语言:javascript
复制
for item in data:
    for key in item:
        print(key, item[key])

来解释双重取消引用。

票数 1
EN

Stack Overflow用户

发布于 2019-06-27 07:20:16

您应该能够加载整个列表,而不只是使用json.load重新构建它,然后迭代它和字典

代码语言:javascript
复制
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字段,所以它应该如下所示:

代码语言:javascript
复制
{  
    "0": {
        "a":"3893",
        "b":"2389",
        "c":"1209"
    },
    "1": {
        "a":"4308",
        "b":"4560",
        "c":"9127"
    }
}

您可以使用字典理解来完成此操作:

代码语言:javascript
复制
with open("file.json", 'w') as out_file:
    json.dump({d.pop(""): d for d in data}, out_file, indent=4)

然后你所需要做的就是简单地迭代这些字典:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56781824

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档