【问题标题】:How do I sort a JSON file name that has numeric file names as the key using Python?如何使用 Python 对以数字文件名作为键的 JSON 文件名进行排序?
【发布时间】:2018-12-15 02:27:50
【问题描述】:

我有一个 JSON 文件,其中包含文件名和每个文件的描述作为键值对。但是,当我尝试对文件进行排序时,使用 OrderedDict 会产生顺序 0.jpg 1.jpg 10.jpg 11 ...... 2 20 等等。

op={int(k) : v for k, v in output.items()}

我试过这样做,但它返回一个 ValueError。 错误如下

ValueError: int() 以 10 为底的无效文字:'1520.png'

【问题讨论】:

  • 您尝试将 str 转换为 int 在您的情况下您可以使用 int('1520.png')
  • 好像你想要Natural sort

标签: python json sorting


【解决方案1】:
OrderedDict(sorted(output.items(), key=lambda item: int(item[0].split('.')[0])))

示例

output = {f'{i}.jpg': None for i in reversed(range(21))}

od = OrderedDict(sorted(output.items(), key=lambda item: int(item[0].split('.')[0])))

输出:

OrderedDict([('0.jpg', None),
             ('1.jpg', None),
             ('2.jpg', None),
             ('3.jpg', None),
             ('4.jpg', None),
             ('5.jpg', None),
             ('6.jpg', None),
             ('7.jpg', None),
             ('8.jpg', None),
             ('9.jpg', None),
             ('10.jpg', None),
             ('11.jpg', None),
             ('12.jpg', None),
             ('13.jpg', None),
             ('14.jpg', None),
             ('15.jpg', None),
             ('16.jpg', None),
             ('17.jpg', None),
             ('18.jpg', None),
             ('19.jpg', None),
             ('20.jpg', None)])

【讨论】:

  • 非常感谢!有效。您能否详细说明您在第二行中做了什么?
  • 第二行的哪个位?这一切都是不言自明的。
【解决方案2】:

您正在对不完全由数字组成的字符串调用int() 函数。您构建的字典理解将遍历原始字典 output 中的每个键/值对,并尝试将每个键转换为整数。

在您的示例中,键是“0.png”、“1.jpg”、“10.png”等文件名,而'10.png' 等字符串不能转换为整数。这就是您收到ValueError 的原因。

在 Python 中排序字典有点棘手,因为我们认为一切都应该基于键的值,而实际上 Python 根据其哈希值对字典键进行排序。

至于使用 OrderedDict,该容器只记住插入键的顺序。听起来它会给你一些排序能力,但它只能保证你循环键的顺序和你把它们放在字典里的顺序一样。

这应该可以帮助你:

od = OrderedDict()
for key in sorted(output):
    od[key] = output[key]

这会将原始字典output 的所有键放在一个列表中,对其进行排序,然后将每个键按排序顺序粘贴到 OrderedDict 中,并带有正确的值。

【讨论】:

    猜你喜欢
    • 2019-04-12
    • 2016-05-03
    • 1970-01-01
    • 2012-04-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2017-03-04
    相关资源
    最近更新 更多