【问题标题】:Define a sorted function for timestamps/time objects by key [duplicate]按键定义时间戳/时间对象的排序函数[重复]
【发布时间】:2016-01-15 22:23:05
【问题描述】:

我有一本时间和计数字典。我需要对字典进行排序,使其按时间升序排列。我需要帮助来做一些有用的事情。现在我正在放弃 AM/PM 以消除复杂性,但我知道我在那里遇到了问题,因为我正在丢失信息。

打电话

sorted(myDict, key = bytime_key)

def bytime_key(input):
    shorter_input = re.match(r'^(.*) \w\w$', input).group(1)
    time = datetime.strptime(shorter_input, '%m/%d/%Y %H:%M:%S')
    return(time)

很好,只是它实际上并没有改变顺序,所以我在这里遗漏了一些基本的东西。

字典示例

myDict = {'1/15/2016 10:41:00 AM': 11, '1/15/2016 10:43:00 AM': 4,
          '1/15/2016 10:22:00 AM': 46, '1/15/2016 10:30:00 AM': 15,
          '1/15/2016 10:59:00 AM': 34, '1/15/2016 12:06:00 PM': 12,
          '1/15/2016 11:42:00 AM': 11, '1/15/2016 12:22:00 PM': 1,
          '1/15/2016 12:18:00 PM': 5, '1/15/2016 10:52:00 AM': 6}

【问题讨论】:

  • 什么顺序? dict 没有任何顺序,sorted 返回一个list 并且不会就地修改输入。见How to sort OrderedDict虽然

标签: python python-2.7 sorteddictionary


【解决方案1】:

strptime 允许 %p 指令。

%p Locale 相当于 AM 或 PM。上午,下午(en_US);上午下午 (de_DE) (1), (2)

按键功能可以简化为:

from datetime import datetime

result = sorted(myDict, key=lambda s: datetime.strptime(s, "%m/%d/%Y %H:%M:%S %p"))
expected = ['1/15/2016 10:22:00 AM', '1/15/2016 10:30:00 AM', 
            '1/15/2016 10:41:00 AM', '1/15/2016 10:43:00 AM',
            '1/15/2016 10:52:00 AM', '1/15/2016 10:59:00 AM', 
            '1/15/2016 11:42:00 AM', '1/15/2016 12:06:00 PM',
            '1/15/2016 12:18:00 PM', '1/15/2016 12:22:00 PM']
assert result == expected

请注意,字典本质上是未排序的结构。您可以做的是对键/值/键值对进行排序,并创建在字典中排序的数据的有序表示。这就是您的代码所做的 - 它对键进行排序。

【讨论】:

    【解决方案2】:

    标准 Python 字典是无序的,不会保留排序中的任何顺序。

    您可以使用OrderedDict 根据插入时间对字典中的项目进行排序。

    from collections import OrderedDict
    
    ordered_times = OrderedDict(sorted(myDict.keys(), key=bytime_key))
    

    【讨论】:

      【解决方案3】:

      Sorted 返回一个新列表,因此它不会修改您的字典。考虑使用list.sort() 就地排序。

      Dictionaries 没有与他们关联的订单。它们查找项目的速度非常快 (O(1)),但对其他操作没有那么有用。

      考虑使用元组列表(时间戳、计数)或OrderedDictionary

      【讨论】:

        【解决方案4】:

        想到了两个问题。 1st,dicts 不可排序。您可能想使用OrderedDict。其次, sorted 不对第一个参数进行排序,它返回第一个参数的排序副本。

        尝试将bytime_key 中的行从:

        shorter_input = re.match(r'^(.*) \w\w$', input).group(1)
        

        shorter_input = re.match(r'^(.*) \w\w$', input[0]).group(1)
        

        然后使用以下方法获取 OrderedDict:

        from collections import OrderedDict
        my_sorted_dict = OrderedDict(sorted(myDict.iteritems(), key = bytime_key))
        

        【讨论】:

          猜你喜欢
          • 2013-11-08
          • 1970-01-01
          • 2019-09-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多