2011-09-04 20 views
64

He podido verificar que el findUniqueWords da como resultado un list ordenado. Sin embargo, no return el list, ¿por qué?¿Por qué "return list.sort()" devuelve None, not the list?

def findUniqueWords(theList): 
    newList = [] 
    words = [] 
    # Read a line at a time 
    for item in theList: 
     # Remove any punctuation from the line 
     cleaned = cleanUp(item) 
     # Split the line into separate words 
     words = cleaned.split() 
     # Evaluate each word 
     for word in words: 
      # Count each unique word 
      if word not in newList: 
       newList.append(word)  
    answer = newList.sort() 
    return answer 
+0

no me th la tinta que necesita para convertir el elemento en una cadena tantas veces. Una vez es normalmente suficiente y es más limpio hacerlo en la entrada para limpiar también. – Ben

+0

Es solo una idea tonta, pero si quieres una lista de artículos únicos, ¿por qué no te conviertes en un conjunto? Luego puede convertirlos a una lista si lo necesita. 'Theset = conjunto (theList)' y ya está, sólo tiene que echarlo hacia atrás a la lista: 'theList = lista (Theset)' Listo. Fácil. – runlevel0

Respuesta

78

list.sort ordena la lista en su lugar, es decir, no devuelve una nueva lista. Sólo tiene que escribir

newList.sort() 
return newList 
+0

'return sorted (newList)' es más corto. No importa aquí ya que la variable es local, pero el ordenamiento in situ podría cambiar una variable compartida en algunos casos. –

-6

favor, vuelva a leer la documentación de la función Python sort, concentrándose en su valor de retorno.

+11

-1. Por favor vuelve a leer la pregunta. Él preguntó "¿Por qué?". Los desarrolladores de python probablemente tengan una razón. La documentación no incluye la motivación para las elecciones de diseño de la función, solo el comportamiento de la función. – Tarrasch

75

El problema está aquí:

answer = newList.sort() 

sort no devuelve la lista ordenada; más bien, ordena la lista en su lugar.

Uso:

answer = sorted(newList) 
10

Python vuelve habitualmente None de funciones y métodos que mutan los datos, tales como list.sort, list.append y random.shuffle, con la idea de que hace alusión al hecho de que fue mutando.

Si desea tomar una lista iterable y devolver una nueva, clasificada de sus elementos, use la función integrada sorted.

44

Here es un correo electrónico de Guido van Rossum en la lista de desarrolladores de python que explica por qué elige no devolver self en operaciones que afectan al objeto y no devuelven uno nuevo.

Esto viene de un estilo de codificación (popular en varios otros idiomas, me creo deleita especialmente Lisp en ella), donde una serie de efectos secundarios en un solo objeto puede ser encadenado como esto:

x.compress().chop(y).sort(z) 

lo que sería lo mismo que

x.compress() 
    x.chop(y) 
    x.sort(z) 

encuentro el encadenamiento formar una amenaza para la legibilidad; requiere que el lector esté íntimamente familiarizado con cada uno de los métodos. El segundo formulario deja en claro que cada una de estas llamadas actúa en el mismo objeto , por lo que incluso si no conoce bien la clase y sus métodos muy , puede entender que la segunda y tercera llamada se aplican a x (y todas las llamadas están hechas para sus efectos secundarios), y no a algo más.

Me gustaría reservar el encadenamiento de las operaciones que devuelven valores nuevos, como las operaciones de procesamiento de cadenas:

y = x.rstrip("\n").split(":").lower() 
+17

De manera divertida, 'split (": "). Lower()' es una cadena incorrecta porque 'split' devuelve una lista que no tiene un método' más bajo '. – SuperBiasedMan

7

Python tiene dos tipos de clases: una especie método (o "función miembro ") y una función de tipo .El método de ordenación opera sobre los contenidos del objeto llamado - piénselo como una acción que el objeto está tomando para reordenarse a sí mismo. La función de ordenación es una operación sobre los datos representados por un objeto y devuelve un nuevo objeto con los mismos contenidos en un orden ordenado.

Dada una lista de números enteros llamado l la propia lista se reordena si llamamos l.sort():

>>> l = [1, 5, 2341, 467, 213, 123] 
>>> l.sort() 
>>> l 
[1, 5, 123, 213, 467, 2341] 

Este método no devuelve ningún valor. ¿Pero qué pasa si intentamos asignar el resultado de l.sort()?

>>> l = [1, 5, 2341, 467, 213, 123] 
>>> r = l.sort() 
>>> print(r) 
None 

r ahora es realmente nada. Este es uno de esos detalles raros, un tanto molestos, que un programador probablemente olvidará después de un período de ausencia de Python (por lo que estoy escribiendo esto, así que I no se olvide de nuevo).

La función sorted(), por el contrario, no hará nada al contenido de l, pero devolverá una nueva lista con el mismo contenido clasificado como l:

>>> l = [1, 5, 2341, 467, 213, 123] 
>>> r = sorted(l) 
>>> l 
[1, 5, 2341, 467, 213, 123] 
>>> r 
[1, 5, 123, 213, 467, 2341] 

Tenga en cuenta que la devuelve valor es no un deep copy, así que tenga cuidado acerca de las operaciones de lado effecty más de los elementos contenidos en la lista como de costumbre:

>>> spam = [8, 2, 4, 7] 
>>> eggs = [3, 1, 4, 5] 
>>> l = [spam, eggs] 
>>> r = sorted(l) 
>>> l 
[[8, 2, 4, 7], [3, 1, 4, 5]] 
>>> r 
[[3, 1, 4, 5], [8, 2, 4, 7]] 
>>> spam.sort() 
>>> eggs.sort() 
>>> l 
[[2, 4, 7, 8], [1, 3, 4, 5]] 
>>> r 
[[1, 3, 4, 5], [2, 4, 7, 8]] 
Cuestiones relacionadas