【问题标题】:Sort Python list of objects by date (when some are None)按日期对 Python 对象列表进行排序(当有些为无时)
【发布时间】:2015-03-10 19:39:37
【问题描述】:

这是对我之前question的小更新

我有一个名为 results 的 Python 列表。结果列表中的大多数结果对象都有一个 person 对象,并且大多数 person 对象都有一个出生日期属性 (result.person.birthdate)。生日是一个日期时间对象。

我想按出生日期排序结果列表,从最早的在前。但是,如果没有人员对象或人员对象没有出生日期,我仍然希望结果列表中包含结果。放在列表的末尾是理想的。

最 Pythonic 的方式是什么?

【问题讨论】:

    标签: python list sorting


    【解决方案1】:
    import datetime
    results.sort(key=lambda r: r.person.birthdate
        if (r and r.person and r.person.birthdate)
        else datetime.datetime.now())
    

    (P.S. 你可能刚刚编辑了你之前的问题。)

    【讨论】:

    • 谢谢。我没有更新原件,因为我认为在我得到正确答案后开始添加新要求可能会令人困惑。
    • 考虑使用datetime.datetime.max而不是datetime.datetime.now(),这样读起来更干净。
    【解决方案2】:
    def birthdate_key(x):
      missing = (x.person is None or x.person.birthdate is None)
      return (missing, x.person.birthdate if not missing else None)
    
    results.sort(key=birthdate_key)
    

    【讨论】:

    • 我将“没有该名称的属性”解释为实际上意味着有一个属性,但它是无。如果该属性实际上不存在,请将“XXX.name is None”都更改为“not hasattr(XXX, "name")”。
    • 你在引用什么?您在哪里看到 OP 的问题中提到的“属性”一词?
    • @John Machin:我已经解释过了。不明白吗?
    【解决方案3】:

    我将“如果没有 person 对象或 person 对象没有生日”解释为结果对象没有“person”属性,同样 result.person 对象没有“ t 有一个“生日”属性。但是我注意到您之前的问题使用了奇怪的术语,例如“person object set to None”(在评论中)。如何将对象设置为无?你的意思是人属性设置为无?当您提出问题时,(1) 请使其独立并 (2) 充分解释您的实际数据结构。

    import datetime
    large_date = datetime.datetime(9999, 12, 31)
    results.sort(key=lambda result:
        result.person.birthdate 
        if hasattr(result, 'person') and hasattr(result.person, 'birthdate')
        else large_date
        )
    

    【讨论】:

      【解决方案4】:

      Maybe monad in Python 可能在这里有用:

      from datetime import datetime
      
      def key(result, default=datetime.max):
          try:
               return result.person.birthday or default
          except AttributeError:
               return default
      
      results.sort(key=key)
      

      【讨论】:

        【解决方案5】:

        提取其中项目具有 None 键的列表并将它们添加到排序列表中。

        haystack = [x for x in haystack if x[date_key] is None] + sorted([x for x in haystack if x[date_key] is None], key=lambda x: x[date_key])
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-04-27
          • 1970-01-01
          • 2012-04-12
          • 1970-01-01
          • 1970-01-01
          • 2014-06-10
          • 1970-01-01
          • 2013-01-06
          相关资源
          最近更新 更多