字典的排序顺序表

时间:2019-07-09 12:50:26

标签: python list loops dictionary

在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的混乱情况,请留下建议的注释。感谢您的帮助!

6 个答案:

答案 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并不是您想要的吗?

最后,也许您应该尝试避免依赖于代码另一部分中的顺序(因为这在您的控制之下)。