这是我之前的question
的略微更新我有一个名为results的Python列表。结果列表中的大多数结果对象都有一个person对象,大多数person对象都有一个birthdate属性(result.person.birthdate)。生日是一个日期时间对象。
我想用birthdate命名结果列表,用最早的第一个。但是,如果没有人物对象或人物对象没有生日,我仍然希望结果列表中包含结果。在列表的末尾是理想的。
最恐怖的方式是什么?
答案 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])