J'essaie de trier les enregistrements dans une liste en utilisant leur «clé» (qui est leur nom). Les enregistrements sont formatés:

CHARLES 2 4 DALLAS TX

RICK 6 9 AUSTIN TX

BOB 9 0 KELLER TX

Comment puis-je trier ces enregistrements dans le dernier par leur prénom uniquement? Jusqu'à présent, mon code est:

list_of_records = []
for line in my_file:
   list_of_records.append(line)

Le fichier que je lis ne contient que 3 enregistrements mais ils ne seront toujours pas triés par nom et je ne peux pas trier manuellement le fichier texte.

2
bobthecoder123 1 févr. 2020 à 22:52

1 réponse

Meilleure réponse

Vous pouvez utiliser l'argument key du builtin sorted de Python fonction.

En supposant que vos enregistrements sont des tuples :

records = [ 
  ("CHARLES", 2, 4, "DALLAS TX"),
  ("RICK", 6, 9, "AUSTIN TX"),
  ("BOB", 9, 0, "KELLER TX")
] 

sorted(records, key=lambda rec: rec[0])

# Produces:                                                                                                                                    
[('BOB', 9, 0, 'KELLER TX'),
 ('CHARLES', 2, 4, 'DALLAS TX'),
 ('RICK', 6, 9, 'AUSTIN TX')]

Ma recommandation serait d'utiliser collections.namedtuple pour créez une classe d'enregistrement et convertissez n'importe quel texte dans les types corrects (par exemple, des entiers) le plus tôt possible. (L'exemple de code ci-dessous omet la conversion en nombres entiers pour plus de simplicité.)

Si vos enregistrements sont des chaînes, vous pouvez appeler line.split(" ") sur chaque élément pour produire des listes.

my_file = [ 
    "CHARLES 2 4 DALLAS TX", 
    "RICK 6 9 AUSTIN TX", 
    "BOB 9 0 KELLER TX", 
] 

Record = collections.namedtuple("Record", "name, i, j, city, state") 
records = [Record(*line.split(" ")) for line in my_file] 

sorted(records, key=lambda rec: rec.name)                                                                                                                                  
# Result: 
# [Record(name='BOB', i='9', j='0', city='KELLER', state='TX'),
#  Record(name='CHARLES', i='2', j='4', city='DALLAS', state='TX'),
#  Record(name='RICK', i='6', j='9', city='AUSTIN', state='TX')]
3
NicholasM 1 févr. 2020 à 20:07