【问题标题】:Scrambled order list of dictionaries [duplicate]字典的乱序列表[重复]
【发布时间】:2019-11-19 00:53:50
【问题描述】:

使用字典列表,在 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 中的混乱,请留下评论建议。感谢您的帮助!

【问题讨论】:

标签: python list loops dictionary


【解决方案1】:

尝试:

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

【讨论】:

    【解决方案2】:

    您实际上可以首先使用json.loadobject_pairs_hook 选项作为有序字典加载。

    from collections import OrderedDict
    import json
    
    js = '{"A": "123", "B": "456", "C": "789", "D": "1011"}'
    md = json.loads(js, object_pairs_hook=OrderedDict)
    

    当您向json.loadjson.loads 提供object_pairs_hook 参数时,只要解析器找到一个json 对象,它就会将该对象作为(已解码)元组的有序列表传递给以object_pairs_hook 提供的函数.所以在这种情况下,loads 将列表 [("A", "123"), ("B", "456"), ("C", "789"), ("D", "1011")] 传递给 OrderedDict

    【讨论】:

      【解决方案3】:

      下面

      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)
      

      【讨论】:

        【解决方案4】:

        您可以在迭代之前对键进行排序。

        我删除了无用的多个 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]))
        

        【讨论】:

          【解决方案5】:

          旧版本的 Python 不保留字典键顺序。从 3.7 开始,它运行良好。

          如果需要,您可以将 items 转换为列表并在循环中使用它们之前对其进行排序 - 但是两次迭代,效率较低。

          您也可以使用collections 模块中的OrderedDict - 用法:

          from collections import OrderedDict
          
          ordered = OrderedDict()
          # Now key order is remembered
          

          【讨论】:

            【解决方案6】:

            您可以使用 Python 3.6+,然后它将使用插入顺序,但我不确定这是否也适用于 JSON 解析。

            否则,您可以尝试先对键进行排序并循环遍历这些键。

            我想使用OrderedDict 不是您想要的?

            最后,也许你应该尽量避免依赖于代码后面部分的顺序(因为它在你的控制之下)。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-04-01
              • 2022-01-03
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多