按日期排序Python对象列表(当一些是None时)

时间:2011-02-20 08:05:44

标签: python list sorting

这是我之前的question

的略微更新

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

我想用birthdate命名结果列表,用最早的第一个。但是,如果没有人物对象或人物对象没有生日,我仍然希望结果列表中包含结果。在列表的末尾是理想的。

最恐怖的方式是什么?

5 个答案:

答案 0 :(得分:10)

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。你刚刚编辑了上一个问题。)

答案 1 :(得分:3)

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)

答案 2 :(得分:0)

我正在解释“如果没有人物对象或者人物对象没有生日”,则表示结果对象没有“人物”属性并且同样有结果。人物对象没有' t有'birthdate'属性。但是我注意到你之前的问题使用了一些奇怪的术语,例如“人物对象设置为无”(在评论中)。如何将对象设置为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
    )

答案 3 :(得分:0)

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)

答案 4 :(得分:0)

提取列表,其中项目具有无键并将其添加到已排序列表。

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])