【问题标题】:Sorting a dictionary (with date keys) in Python在 Python 中对字典(使用日期键)进行排序
【发布时间】:2010-10-20 11:34:39
【问题描述】:

我有一本字典。键是日期(日期时间)。我需要对字典进行排序,以便字典中的值按日期排序 - 这样通过遍历字典,我可以按所需的时间顺序(即日期/时间)处理项目。

如何按日期对这样的字典进行排序?

例子:

mydict = { '2000-01-01': {fld_1: 1, fld_2: 42}, '2000-01-02': {fld_1:23, fld_2: 22.17} }

注意:我在这里使用字符串而不是日期时间,以保持示例简单

【问题讨论】:

  • 排序也应该以 yyyy-mm-dd 格式作为字符串工作。
  • 很高兴有人问过这个问题;)

标签: python dictionary


【解决方案1】:

如果您使用的是 Python 2.7+ 或 3.1+,您可以从某种字典中创建一个 OrderedDict from collections,然后对其进行迭代。

from collections import OrderedDict

ordered = OrderedDict(sorted(mydict.items(), key=lambda t: t[0]))

但是,根据您想要执行的操作,从您的 dict 中迭代排序的键列表可能更容易。

【讨论】:

  • 有什么比创建OrderedDict 或在对字典进行任何更改后检索并排序键更好的方法是SortedDict
  • 当人们只想要自然的排序顺序时,为什么还要坚持使用key
  • 对于像我这样的 Python 新手,@martineau 意味着您可以像 ordered = OrderedDict(sorted(mydict.items()) 那样实现相同的目标,请注意,如果键是实际的日期时间对象而不是字符串,则排序的工作方式相同
  • @jbustamovej:我的字面意思是下载、安装和使用 sorteddict 扩展模块,而不是这个答案中的内容(或您评论中的替代方法)。 “sorteddicts 的主要好处是您永远不必显式排序。”
  • 它拯救了我的一天。谢谢:)
【解决方案2】:

由于您的日期字符串似乎是正确的格式,您可以这样做:

>>> sorted(mydict.items())         # iteritems in py2k
[('2000-01-01', {'fld_2': 42, 'fld_1': 1}), ('2000-01-02', {'fld_2': 22.17, 'fld_1': 23})]

【讨论】:

    【解决方案3】:

    字典无法排序。而是迭代 sorted(mydict.keys())

    【讨论】:

    • 如果你愿意,也可以说sorted(mydict)
    【解决方案4】:

    字典从不按某种顺序存储任何东西。但是您可以使用d.keys() 获取可以排序的键列表。迭代生成器,如下所示。

    def sortdict(d):
        for key in sorted(d): yield d[key]
    

    使用它,您将能够按时间顺序迭代值。

    for value in sortdict(mydict):
        # your code
        pass
    

    【讨论】:

    • 那里不需要.keys()
    • @SilentGhost:哦,是的!你去吧。
    【解决方案5】:

    我确信 python 知道如何比较日期。所以:

    def sortedDictValues(adict):
     items = adict.items()
     items.sort()
     return [value for key, value in items]
    

    【讨论】:

    • Python 比较 datetime 对象没有任何问题。在这种情况下,YYYY-MM-DD 字符串也可以正确比较。问题是日期格式为MM/DD/YYYYDD.MM.YYYY,但不是YYYY-MM-DD
    • 你的代码最后三行也可以写成return [value for key, value in sorted(adict.items())]
    【解决方案6】:

    Python 2.7(2010 年 7 月 3 日发布)支持有序字典类型:

    http://www.python.org/download/releases/2.7/

    【讨论】:

    • 有序字典会记住插入的顺序。但是 blist 模块有 sorteddict pypi.python.org/pypi/blist
    • 但是订单字典不是也有“排序”功能吗?
    • 如果你这么说,是的。然后它将保留以供将来使用。对我来说更自然的是 sorteddict。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-10
    相关资源
    最近更新 更多