Estoy tratando de ordenar una lista de cadenas en python por dos valores. Lo que se me ocurrió es:

import operator
l = ['A1 B2', 'A2 B2', 'A1 B3', 'A2 B1', 'A1 B1']
sorted(l, key=operator.itemgetter(1, 4))
['A1 B1', 'A1 B2', 'A1 B3', 'A2 B1', 'A2 B2']

Sin embargo, la posición de las teclas está relativamente codificada y si las cadenas cambian a ['AA1 BB2', 'AA2 BB2', 'AA1 BB3', 'AA2 BB1', 'AA1 BB1'], no funcionará. Además, los números también pueden tener más de un dígito ['A1 B202', 'A2 B101', 'A1 B200', 'A2 B100', 'A1 B201'].

¿Cómo puedo ordenar la lista de cadenas por los dos dígitos de manera más elegante?

1
filtfilt 9 sep. 2018 a las 10:25

3 respuestas

La mejor respuesta

¿Funcionan los módulos de terceros? Puede usar natsort con una clave que divide y ordena naturalmente:

>>> import natsort
>>> natsort.natsorted(l, key=str.split)
['AA1 BB1', 'AA1 BB2', 'AA1 BB3', 'AA2 BB1', 'AA2 BB2']

Puede instalar natsort con pip.

  • Debería funcionar cuando hay más de un dígito
  • También debería funcionar cuando hay más de dos palabras por cadena.
  • También debería funcionar cuando el número no está al final de la cadena

La clasificación se realiza naturalmente , no lexicográficamente como en las otras respuestas, que casualmente devuelve la misma respuesta que una clasificación natural, para los ejemplos presentados aquí.

2
cs95 9 sep. 2018 a las 07:37
l = ['A1 B202', 'A2 B101', 'A1 B200', 'A2 B100', 'A1 B201']
l = [" ".join(i) for i in sorted(i.split() for i in l)]

Perdón por los errores escritos en el móvil

0
Jonas Wolff 9 sep. 2018 a las 14:36

Lo mejor es sin lambda:

>>> l=['A1 B202', 'A2 B101', 'A1 B200', 'A2 B100', 'A1 B201']
>>> sorted(l,key=str.split)
['A1 B200', 'A1 B201', 'A1 B202', 'A2 B100', 'A2 B101']
>>> 
1
U10-Forward 9 sep. 2018 a las 07:34