【问题标题】:sorting python list based on key根据键对python列表进行排序
【发布时间】:2013-01-07 14:56:50
【问题描述】:

我在 python 列表中有一些条目。每个条目都有一个创建日期和创建时间。值存储为 python datetime.date 和 datetime.time(作为两个单独的字段)。我需要获取条目列表已排序,以便之前创建的条目排在其他条目之前。

我知道有一个 list.sort() 函数接受一个键函数。在这种情况下,我是否必须使用日期和时间来创建一个日期时间并将其用作sort() 的键?为此有一个datetime.datetime.combine(date,time)。但是如何在 sort 函数中指定呢?

我试过key = datetime.datetim.combine(created_date,created_time)

但是解释器抱怨the name created_date is not defined

class Entry: 
   created_date = #datetime.date
   created_time  = #datetime.time
   ...

my_entries_list=[Entry1,Entry2...Entry10]
my_entries_list.sort(key = datetime.datetim.combine(created_date,created_time))

【问题讨论】:

  • 这永远行不通。您需要定义自己的方法或 lambda 方法来执行此处所需的计算。

标签: python sorting key


【解决方案1】:

你可能想要这样的东西:

my_entries_list.sort(key=lambda v:
                           datetime.datetime.combine(v.created_date, v.created_time))

传递datetime.datetime.combine(created_date, created_time) 尝试立即调用combine 并中断,因为created_datecreated_time 不能用作局部变量。 lambda 提供延迟评估:它不是立即执行代码,而是创建一个函数,当被调用时,它将执行指定的代码并返回结果。该函数还提供了用于访问created_datecreated_time 属性的参数。

【讨论】:

    【解决方案2】:

    使用lambda:

    sorted(my_entries_list,
           key=lambda e: datetime.combine(e.created_date, e.created_time))
    

    【讨论】:

      【解决方案3】:

      来自documentation

      key 指定一个参数的函数,用于从每个列表元素中提取比较键

      例如。

      def combined_date_key(elem):
          return datetime.datetime.combine(v.created_date, v.created_time)
      
      entries.sort(key=combined_date_key)
      

      (这与已经发布的 lambda 相同,只是为了清晰起见)。

      您的另一个选择是使用cmp 参数(这里不需要,但是对于可以短路的足够昂贵的键功能,这可能会更快)

      【讨论】:

        【解决方案4】:

        使用这样的元组可能会稍微快一点:

        sorted(my_entries_list,
               key = lambda e: (e.created_date, e.created_time))
        

        然后事情将按日期排序,只有当日期匹配时才会考虑时间。

        【讨论】:

          猜你喜欢
          • 2015-11-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-06-27
          相关资源
          最近更新 更多