难以解析字典列表,无法通过循环访问每个词典的所有键值对,以便一次处理每个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
代码有错误,我尚不知道如何实现上述目标,这可能很简单,但我尚未找到它。
答案 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