9
votes

Trier la liste des objets Python par date (quand certaines ne sont pas)

Ceci est une légère mise à jour de mon précédent Question

J'ai une liste Python appelée résultats. La plupart des objets de résultat dans la liste des résultats ont un objet personne et la plupart des objets de la personne ont une propriété de base de naissance (résultat.person.birthdate). La date de naissance est un objet DateTime.

Je voudrais commander la liste des résultats par date de naissance avec le plus ancien premier. Cependant, s'il n'y a pas d'objet personne ou que l'objet de la personne n'a pas de retard de naissance, je voudrais toujours le résultat inclus dans la liste des résultats. À la fin de la liste serait idéal.

Quelle est la façon la plus pythonique de faire cela?


0 commentaires

5 Réponses :


11
votes
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. You could have just edited your previous question.)

2 commentaires

Merci. Je n'ai pas mis à jour l'original parce que je pensais que cela pourrait être déroutant de commencer à ajouter de nouvelles exigences après avoir une réponse correcte.


Pensez à utiliser denttime.dateTime.max au lieu de denttime.dateTetime.now () Il lit plus propre.



4
votes
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)

3 commentaires

J'ai interprété "Il n'y a pas d'attribut de ce nom" pour vouloir dire qu'il y a un attribut, mais ce n'est pas. Si l'attribut n'existe pas réellement, changez à la fois "xxx.name None Aucun" to "Not halattr (xxx," nom ")".


Qu'est-ce que tu cites? Où voyez-vous le mot "attribut" mentionné dans la question de l'OP?


@John Machin: J'ai paraphrasé. N'était-ce pas compréhensible?



0
votes

Je suis d'interprétation "S'il n'y a pas d'objet personne ou que l'objet de la personne n'a pas de retard de naissance" pour signifier si l'objet de résultat n'a pas d'attribut "personne" et de même résultat. T avoir un attribut «daté de naissance». Cependant, je remarque que votre question précédente utilise une terminologie étrange comme "objet de la personne définie sur Aucun" (dans un commentaire). Comment définissez-vous un objet à aucun? Voulez-vous dire l'attribut de la personne à néant? Lorsque vous posez une question (1), veuillez le rendre autonome et (2) expliquer pleinement quelle est votre structure de données réelle.

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
    )


0 commentaires

0
votes

Peut-être que Monad à Python pourrait être utile ici:

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)


0 commentaires

0
votes

Liste d'extrait dans laquelle les éléments n'ont aucune touche et les ajouter à la liste triée.

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


0 commentaires