Entrada de muestra
20, 71146620 100, 26867616 10, 02513583 10, 52811698 100, 23859051
Lo leí desde un archivo como un argumento de línea de comando a una lista con
lin = [i.strip() for i in open(sys.argv[1]).readlines()]
esa lista se parece a ['20, 71146620', '100, 26867616', '10, 02513583', '10, 52811698', '100, 23859051']
Mi esperanza es encontrar la forma más pirónica de ordenar esta lista, primero para el primer valor y luego para el segundo para que se vea como:
['10, 02513583', '10, 52811698', '20, 71146620', '100, 23859051', '100, 26867616', ]
Actualmente estoy intentando convertirlo en una lista de pares de valores clave, pero no estoy seguro de que sea la dirección correcta a seguir.
Lo más fácil de hacer es analizar los pares en listas y luego ordenarlos:
lin = [i.strip().split(', ') for i in open(sys.argv[1]).readlines()] lin = sorted(lin)
En caso de que desee ordenar numéricamente, simplemente convierta a números:
lin = [map(int, i.strip().split(', ')) for i in open(sys.argv[1]).readlines()] lin = sorted(lin)
import sys with open(sys.argv[1]) as f: lin = sorted([[int(j) for j in i.split(",")] for i in f]) print lin
Puedes ordenar las líneas como cadenas, usando una función de tecla
def two_ints(s): return map(int, s.split(",")) with open("num.txt") as f: for line in sorted(f, key=two_ints): print line
Realmente depende de si desea que el resultado sea una lista de cadenas o una lista de listas de caracteres.
Una vez que se haya convertido a int, no hay forma de recuperar el cero inicial en “02513583”, por lo que es preferible dejar el resultado como cadenas
¿por qué no solo usar el módulo csv y alimentarlo para ordenar (con una cadena de conversión de entero)?
import csv with open("test.csv") as f: cr = csv.reader(f) result = sorted(list(map(int,row)) for row in cr)
Salir:
>>> result [[10, 2513583], [10, 52811698], [20, 71146620], [100, 23859051], [100, 26867616]]
sort
hace exactamente lo que se solicita aquí: utiliza el orden natural de clasificación de las listas