【问题标题】:Sorting dates that are nested inside a list in python对嵌套在python列表中的日期进行排序
【发布时间】:2020-07-21 17:28:35
【问题描述】:

所以我有一个列表,其中包含其他列表。这些内部列表的第一个元素是浮点 id,第二个元素是日期。我希望根据日期对该列表进行排序,但要确保该日期的相应 id 与其相应的日期保持一致...

这就是原始列表的样子...

[[1.33315, '2020/07/22'],[1.33315, '2020/07/25'],[1.33315, '2020/07/27'],[1.346646, '2020/07/21'], [1.345646, '2020/07/21'],[1.345646, '2020/07/22'],[1.345646, '2020/07/25']]

我希望它像这样排序

[[1.346646, '2020/07/21'],[1.345646, '2020/07/21'],[1.33315, '2020/07/22'],[1.345646, '2020/07/22'],[1.33315, '2020/07/25'],[1.345646, '2020/07/25'],[1.33315, '2020/07/27']]

我需要排序尽可能快,同时又要简单。我尝试使用插入排序,但它似乎不起作用 这是代码,dates 是保存前面提到的列表的变量

def date_sort(self, dates):
    
    for i in range(1,len(dates)):
        items_to_insert = dates[i][1]
        print(items_to_insert)
        j = i - 1 
        
        y = datetime.strptime(dates[j][1],"%Y/%m/%d")
        z = datetime.strptime(items_to_insert,"%Y/%m/%d")
        while j >= 0 and y > z:
            dates[j+1] = dates[j]
            j-=1
            break
        else:
            dates[j+1][1] = items_to_insert
        
    print(dates)

这是我得到的输出...

[[1.33315, '2020/07/22'], [1.33315, '2020/07/25'], [1.33315, '2020/07/27'], [1.33315, '2020/07/27'], [1.33315, '2020/07/27'], [1.33315, '2020/07/27'], [1.33315, '2020/07/27']]

如您所见,其中一些值已完全改变。我不明白我错过了什么,或者有没有更好的方法来做到这一点?谢谢!

【问题讨论】:

  • 不要从头开始实现排序,使用内置的sorted
  • 不需要用你自己的排序算法重新发明轮子,当你可以使用内置函数并给它一个键时:sorted(my_list, key=lambda x:x[::-1])应该用最后一个元素对my_list进行排序(在在这种情况下,日期)优先。而且由于您将日期设置为年/月/日,因此它们应该正确排序。您想要一个专门纠正您的插入排序算法的解决方案,还是这样就足够了?
  • 哦,非常感谢...我不知道你能做到这一点...非常感谢:)...这绰绰有余

标签: python list sorting insertion-sort


【解决方案1】:
from datetime import datetime
lst.sort(key=lambda x: datetime.strptime(x[1], "%Y/%m/%d"))

【讨论】:

    【解决方案2】:

    单行 lambda

    xs = [[1.33315, '2020/07/22'],[1.33315, '2020/07/25'],[1.33315, '2020/07/27'],[1.346646, '2020/07/21'], [1.345646, '2020/07/21'],[1.345646, '2020/07/22'],[1.345646, '2020/07/25']]
    
    print(sorted(xs, key=lambda x: x[1]))
    
    ## will give you 
    ## [[1.346646, '2020/07/21'], [1.345646, '2020/07/21'], [1.33315, '2020/07/22'], [1.345646, '2020/07/22'], [1.33315, '2020/07/25'], [1.345646, '2020/07/25'], [1.33315, '2020/07/27']]
    

    【讨论】:

      【解决方案3】:

      您可以使用返回排序列表的sorted(iterable),也可以使用list.sort() 对列表进行就地排序。

      这两个函数都采用key 参数,该参数告诉函数使用什么参数进行排序。 在您的情况下,

      # Using sorted(iterable)
      >>> sorted(xs, key=lambda x: x[1])
      [[1.346646, '2020/07/21'], [1.345646, '2020/07/21'], [1.33315, '2020/07/22'], [1.345646, '2020/07/22'], [1.33315, '2020/07/25'], [1.345646, '2020/07/25'], [1.33315, '2020/07/27']]
      
      # Using list.sort()
      >>> xs = [[1.33315, '2020/07/22'],[1.33315, '2020/07/25'],[1.33315, '2020/07/27'],[1.346646, '2020/07/21'], [1.345646, '2020/07/21'],[1.345646, '2020/07/22'],[1.345646, '2020/07/25']]
      >>> xs.sort(key=lambda x: x[1])
      >>> xs
      [[1.346646, '2020/07/21'], [1.345646, '2020/07/21'], [1.33315, '2020/07/22'], [1.345646, '2020/07/22'], [1.33315, '2020/07/25'], [1.345646, '2020/07/25'], [1.33315, '2020/07/27']]
      
      

      【讨论】:

        猜你喜欢
        • 2010-09-21
        • 2014-05-20
        • 2019-02-24
        • 1970-01-01
        • 2013-02-06
        • 2021-03-07
        • 1970-01-01
        相关资源
        最近更新 更多