He leído esta publicación y es hasn ' Terminé trabajando para mí.

Editar: la funcionalidad que describo es como la función de clasificación en Excel ... si eso lo aclara más

Aquí está mi situación, tengo un documento de texto delimitado por tabuladores. Hay alrededor de 125,000 líneas y 6 columnas por línea (las columnas están separadas por un carácter de tabulación). He dividido el documento en una lista de dos dimensiones.

Estoy tratando de escribir una función genérica para ordenar listas bidimensionales. Básicamente, me gustaría tener una función en la que pueda pasar la lista grande, y la clave de una o más columnas por las que me gustaría ordenar la lista grande. Obviamente, me gustaría que la primera clave que se pasara sea el punto de clasificación principal, luego la segunda clave, etc.

¿Todavía confundida?

Aquí hay un ejemplo de lo que me gustaría hacer.

Joel    18  Orange  1
Anna    17  Blue    2
Ryan    18  Green   3
Luke    16  Blue    1
Katy    13  Pink    5
Tyler   22  Blue    6
Bob     22  Blue    10
Garrett 24  Red 7
Ryan    18  Green   8
Leland  18  Yellow  9

Digamos que pasé esta lista a mi función mágica, así:

sortByColumn(bigList, 0)

Anna    17  Blue    2
Bob     22  Blue    10
Garrett 24  Red 7
Joel    18  Orange  1
Katy    13  Pink    5
Leland  18  Yellow  9
Luke    16  Blue    1
Ryan    18  Green   3
Ryan    18  Green   8
Tyler   22  Blue    6

Y...

sortByColumn(bigList, 2, 3)

Luke    16  Blue    1
Anna    17  Blue    2
Tyler   22  Blue    6
Bob     22  Blue    10
Ryan    18  Green   3
Ryan    18  Green   8
Joel    18  Orange  1
Katy    13  Pink    5
Garrett 24  Red 7
Leland  18  Yellow  9

¿Alguna pista?

9
Joel Verhagen 6 nov. 2009 a las 00:30

4 respuestas

La mejor respuesta
import operator:
def sortByColumn(bigList, *args)
    bigList.sort(key=operator.itemgetter(*args)) # sorts the list in place
11
Dana the Sane 12 sep. 2016 a las 17:35

Asegúrese de haber convertido los números a ints, de lo contrario, se ordenarán alfabéticamente en lugar de numéricamente

# Sort the list in place
def sortByColumn(A,*args):
    import operator
    A.sort(key=operator.itemgetter(*args))
    return A

O

# Leave the original list alone and return a new sorted one
def sortByColumn(A,*args):
    import opertator
    return sorted(A,key=operator.itemgetter(*args))
1
John La Rooy 5 nov. 2009 a las 22:38

La idea clave aquí (juego de palabras) es usar una función clave que devuelva una tupla. A continuación, la función clave es lambda x: (x[idx] for idx in args) x está configurado para igualar un elemento de una Lista, es decir, una fila de datos. Devuelve una tupla de valores, no solo un valor. El método sort () ordena de acuerdo con el primer elemento de la lista, luego rompe los lazos con el segundo, y así sucesivamente. Ver http://wiki.python.org/moin/HowTo/Sorting#Sortingbykeys

#!/usr/bin/env python
import csv
def sortByColumn(aList,*args):
    aList.sort(key=lambda x: (x[idx] for idx in args))
    return aList

filename='file.txt'
def convert_ints(astr):
    try:
        return int(astr)
    except ValueError:
        return astr    
biglist=[[convert_ints(elt) for elt in line]
         for line in csv.reader(open(filename,'r'),delimiter='\t')]

for row in sortByColumn(biglist,0):
    print row

for row in sortByColumn(biglist,2,3):
    print row
2
unutbu 5 nov. 2009 a las 22:11

Esto se ordenará por las columnas 2 y 3:

a.sort(key=operator.itemgetter(2,3))
8
interjay 5 nov. 2009 a las 21:44