【问题标题】:When reading a JSON file, how to prevent the output values ​from being interlaced?读取JSON文件时,如何防止输出值交错?
【发布时间】:2019-04-12 13:05:25
【问题描述】:

从 Python 脚本读取 JSON 文件时遇到问题。 这是 JSON 文件:

{
    "a": 1,
    "b": 2,
    "c": 3, 
    "d": 4, 
    "e": 5, 
    "f": 6, 
    "g": 7, 
    "h": 8, 
    "i": 9
}

这是我从当前路径打开 JSON 文件并读取与其中的字母关联的每个值的 Python 文件:

with open(os.getcwd() + '/letters.json') as lettersListJSON:
    lettersList = json.load(lettersListJSON)
    for char in lettersList
        print lettersList[char]

我奇怪地得到了这个输出:

1
3
2
5
4
7
6
9
8

为什么这些值是交错的,我怎样才能防止这种情况发生? 我应该用互斥锁锁定变量的访问吗?

【问题讨论】:

  • 这并不奇怪.. json.load 返回一个字典,字典没有排序。
  • 字典没有顺序。只有 python 3.7 的插入顺序得到保证,而 ipython 3.6 有这个副作用。您不知道它们是如何插入的......所以它可能是插入顺序。如果您希望按键输出按按键排序,请使用for char in sorted(lettersList):
  • 可能的欺骗:stackoverflow.com/questions/35609991/…(用于打印排序部分) - 不是 json 如何创建 dict 或 stackoverflow.com/questions/1479649/…
  • @ChristianSloper 非常感谢!我不知道 json.load 返回了一个未排序的字典。

标签: python json


【解决方案1】:

letterList 实际上是letterDict,所以它没有被订购。

如果你真的希望它是有序的,你可以将 JSON 加载到 OrderedDict 中:

from  collections import OrderedDict

letters = json.load(letterslistJSON, object_pairs_hook=OrderedDict)   

(显然我省略了打开文件等)

【讨论】:

  • 记住 OrderedDict 维护一个双链表,并且是字典大小的两倍以上
【解决方案2】:

由于任何“线程”问题,您的输出不会交错。 python 3.6 之前的字典不排序,CPython 引入了基于 3.5 实现细节的插入顺序排序,从 Python 3.7 开始,默认保证插入顺序。

更多信息:

您不知道 json.load 如何创建字典 - 如果您希望对输出进行排序 - 对其进行排序:

t = """{
    "a": 1,
    "b": 2,
    "c": 3, 
    "d": 4, 
    "e": 5, 
    "f": 6, 
    "g": 7, 
    "h": 8, 
    "i": 9
}"""

import json

lettersList = json.loads(t)
for char in lettersList:
    print lettersList[char]

lettersList = json.loads(t)
for char in sorted(lettersList):    # sort your keys before printing
    print lettersList[char]

输出:

# not sorted
1
3
2
5
4
7
6
9
8

# sorted keys
1
2
3
4
5
6
7
8
9

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 2021-11-15
    • 2018-12-14
    • 2019-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多