在json数据集(mydata.json)中具有字典列表,如下所示:
[
{"A": "123", "B": "456", "C": "789", "D": "1011"},
{"A": "1213", "B": "1415", "C": "1617", "D": "1819"},
...
]
我试图遍历每个字典,并按其存储顺序提取每个键值对。
我希望按字典的特定顺序保留A,B,C,D序列,以便能够将它们传递到另一段代码中,以对其进行进一步处理。
为简单起见,我正在测试以下嵌套的for循环的每次迭代中的每个步骤。
不幸的是,它没有按照我需要的方式处理字典。
我需要在每个循环中以该顺序访问每个键值对,例如包含键A的第一个字典应在该字典的第一个B-C-D之后。
然后应该处理第二个字典,从A开始,然后是B-C-D,等等。
我尝试过的事情:
with open("mydata.json", "r") as read_file:
md = json.load(read_file)
for d in md:
for k,v in d.items():
if (k == "A"):
print(k + ": " + v)
continue
if (k == "B"):
print(k + ": " + v)
continue
if (k == "C"):
print(k + ": " + v)
continue
if (k == "D"):
print(k + ": " + v)
continue
else:
continue
所需的输出(严格的顺序):
A: 123
B: 456
C: 789
D: 1011
A: 1213
B: 1415
C: 1617
D: 1819
实际输出(加扰顺序):
B: 456
D: 1011
A: 123
C: 789
A: 1213
C: 1617
... etc.
任何建议都将不胜感激。
编辑:
我确实已将我的问题标记为重复,对此表示歉意! 如果我需要将其完全删除,以减少SO的混乱情况,请留下建议的注释。感谢您的帮助!
答案 0 :(得分:0)
Python的较旧版本不保留字典键顺序。从3.7开始,它运行良好。
如果需要,您可以将items
转换为列表并对其进行排序,然后再在循环中使用它们-尽管进行了两次迭代,所以效率较低。
您也可以使用OrderedDict
模块中的collections
-用法:
from collections import OrderedDict
ordered = OrderedDict()
# Now key order is remembered
答案 1 :(得分:0)
您可以在迭代之前对键进行排序。
我删除了无用的多个if / continue语句,并将for
循环移到with
块之外,因为您应该在不需要时立即关闭该文件。
with open("mydata.json", "r") as read_file:
md = json.load(read_file)
for d in md:
for key in sorted(d.keys()):
if key in ["A","B","C","D"]:
print('{}: {}'.format(key, d[key]))
答案 2 :(得分:0)
下面
from collections import OrderedDict
lst = [
{"A": "123", "B": "456", "C": "789", "D": "1011"},
{"A": "1213", "B": "1415", "C": "1617", "D": "1819"},
]
lst1 = []
for d in lst:
tmp = sorted(d.keys())
x = OrderedDict()
for z in tmp:
x[z] = d[z]
lst1.append(x)
答案 3 :(得分:0)
实际上,您可以首先使用object_pairs_hook
的{{1}}选项作为有序dict加载。
json.load
当您为from collections import OrderedDict
import json
js = '{"A": "123", "B": "456", "C": "789", "D": "1011"}'
md = json.loads(js, object_pairs_hook=OrderedDict)
或object_pairs_hook
提供json.load
参数时,只要解析器找到一个json对象,它就会将该对象作为(已解码的)元组的有序列表传递给功能以json.loads
的形式提供。因此,在这种情况下,object_pairs_hook
将列表loads
传递给[("A", "123"), ("B", "456"), ("C", "789"), ("D", "1011")]
。
答案 4 :(得分:0)
尝试:
data = [
{"A": "123", "B": "456", "C": "789", "D": "1011"},
{"A": "1213", "B": "1415", "C": "1617", "D": "1819"}
]
for dict in data:
for key, value in dict.items():
print ("{}:{}".format(key,value))
输出:
A:123
B:456
C:789
D:1011
A:1213
B:1415
C:1617
D:1819
答案 5 :(得分:-1)
您可以使用Python 3.6+,然后将使用插入顺序,尽管我不确定这是否也适用于JSON解析。
否则,您可以先尝试对键进行排序,然后遍历这些键。
我想使用OrderedDict
并不是您想要的吗?
最后,也许您应该尝试避免依赖于代码另一部分中的顺序(因为这在您的控制之下)。