Je dois trier une liste contenant d'autres listes en fonction de la valeur de l'index 0. Comme il peut être clair en voyant l'exemple ci-dessous, je dois trier 'tempdb' en fonction des années de chaque liste imbriquée, mais je n'ai aucune idée. Je ne suis pas autorisé à importer une bibliothèque comme NumPy, etc. donc juste du code Python «nu».

Exemple de liste:

tempdb = [
['8-8-2007', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2007'],
['8-8-2015', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2015'],
['30-11-2005', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'nov', '2005'],
['8-8-2006', '268', 'Anonymized', 'ordertarief', 'aug', '2006'],
['30-11-2006', '268', 'Anonymized', 'ordertarief', 'nov', '2006'],
['30-11-2003', '268', 'Anonymized', 'gammaglutamyltranspeptidase', 'nov', '2003'],
['30-11-2006', '268', 'Anonymized', 'melkzuurdehydrogenase -ldh- kinetisch', 'nov', '2006'],
['30-11-2006', '268', 'Anonymized', 'alkalische fosfatase -kinetisch-', 'nov', '2006'],
['30-11-2002', '268', 'Anonymized', 'natrium vlamfotometrisch', 'nov', '2002'],
]

C'est quelque chose que j'ai trouvé et déjà essayé, mais cela n'a pas fonctionné pour moi.

sort_on   = lambda pos:     lambda x: x[pos]
tempdb = sorted(tempdb,key=sort_on(1)) 

Mon objectif était de commencer par l'année la plus ancienne (ex. 2002) et de terminer par l'année la plus récente (ex. 2015)

1
Miguel 27 janv. 2019 à 16:24

3 réponses

Meilleure réponse

Vous pouvez utiliser le module datetime pour comparer les dates:

from datetime import datetime

tempdb = [
['8-8-2007', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2007'],
['8-8-2015', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2015'],
['30-11-2005', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'nov', '2005'],
['8-8-2006', '268', 'Anonymized', 'ordertarief', 'aug', '2006'],
['30-11-2006', '268', 'Anonymized', 'ordertarief', 'nov', '2006'],
['30-11-2003', '268', 'Anonymized', 'gammaglutamyltranspeptidase', 'nov', '2003'],
['30-11-2006', '268', 'Anonymized', 'melkzuurdehydrogenase -ldh- kinetisch', 'nov', '2006'],
['30-11-2006', '268', 'Anonymized', 'alkalische fosfatase -kinetisch-', 'nov', '2006'],
['30-11-2002', '268', 'Anonymized', 'natrium vlamfotometrisch', 'nov', '2002'],
]

tempdb = sorted(tempdb, key=lambda x: datetime.strptime(x[0], '%d-%m-%Y'))

for i in tempdb: print(i)

Production:

['30-11-2002', '268', 'Anonymized', 'natrium vlamfotometrisch', 'nov', '2002']
['30-11-2003', '268', 'Anonymized', 'gammaglutamyltranspeptidase', 'nov', '2003']
['30-11-2005', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'nov', '2005']
['8-8-2006', '268', 'Anonymized', 'ordertarief', 'aug', '2006']
['30-11-2006', '268', 'Anonymized', 'ordertarief', 'nov', '2006']
['30-11-2006', '268', 'Anonymized', 'melkzuurdehydrogenase -ldh- kinetisch', 'nov', '2006']
['30-11-2006', '268', 'Anonymized', 'alkalische fosfatase -kinetisch-', 'nov', '2006']
['8-8-2007', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2007']
['8-8-2015', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2015']

Si vous souhaitez trier dans la direction opposée, ajoutez reverse=True à la fonction sorted().

2
Mykola Zotko 27 janv. 2019 à 13:54

La solution la plus simple serait de trier par la dernière chaîne de chaque liste interne .. mais cela ne triera pas correctement les mois / jours si une année est identique.

Vous pouvez utiliser le premier élément si vous le divisez en '-', convertissez chaque nombre en entier et inversez le résultat et utilisez-le pour trier:

'8-8-2015' --> [2015,8,8] 

Code:

tempdb = [
['8-8-2007', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2007'],
['8-8-20015', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2015'],
['30-11-2005', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'nov', '2005'],
['8-8-2006', '268', 'Anonymized', 'ordertarief', 'aug', '2006'],
['30-11-2006', '268', 'Anonymized', 'ordertarief', 'nov', '2006'],
['30-11-2003', '268', 'Anonymized', 'gammaglutamyltranspeptidase', 'nov', '2003'],
['30-11-2006', '268', 'Anonymized', 'melkzuurdehydrogenase -ldh- kinetisch', 'nov', '2006'],
['30-11-2006', '268', 'Anonymized', 'alkalische fosfatase -kinetisch-', 'nov', '2006'],
['30-11-2002', '268', 'Anonymized', 'natrium vlamfotometrisch', 'nov', '2002'],
]

s = sorted(tempdb, key = lambda x: list(map(int,reversed(x[0].split('-')))))
print(s)

Production:

[['30-11-2002', '268', 'Anonymized', 'natrium vlamfotometrisch', 'nov', '2002'], 
 ['30-11-2003', '268', 'Anonymized', 'gammaglutamyltranspeptidase', 'nov', '2003'], 
 ['30-11-2005', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'nov', '2005'], 
 ['8-8-2006', '268', 'Anonymized', 'ordertarief', 'aug', '2006'], 
 ['30-11-2006', '268', 'Anonymized', 'ordertarief', 'nov', '2006'], 
 ['30-11-2006', '268', 'Anonymized', 'melkzuurdehydrogenase -ldh- kinetisch', 'nov','2006'],
 ['30-11-2006', '268', 'Anonymized', 'alkalische fosfatase -kinetisch-', 'nov', '2006'],
 ['8-8-2007', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2007'], 
 ['8-8-20015', '268', 'Anonymized', 'aanname laboratoriumonderzoek', 'aug', '2015']]

Vous avez toujours des données "invalides" - p. Ex. '8-8-20015' - c'est à vous.

1
Patrick Artner 27 janv. 2019 à 13:43

En supposant que vous vouliez trier par année puis par le nombre au milieu puis par le premier nombre de la date:

sorted(tempdb, key=lambda x: tuple(map(int, x[0].split('-')[::-1])))
0
sam46 27 janv. 2019 à 13:45