web-dev-qa-db-fra.com

Pourquoi "return list.sort ()" ne renvoie-t-il aucun, pas la liste?

J'ai pu vérifier que le findUniqueWords aboutissait à un list trié. Cependant, il ne s'agit pas de return le list, pourquoi?

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
117
Lee_Str

list.sort trie la liste en place, c’est-à-dire qu’elle ne renvoie pas de nouvelle liste. Ecrivez

newList.sort()
return newList
140
Ismail Badawi

Le problème est ici:

answer = newList.sort()

sort ne renvoie pas la liste triée; plutôt, il trie la liste en place.

Utilisation:

answer = sorted(newList)
116
NPE

Ici est un email de Guido van Rossum dans la liste des développeurs de python, qui explique pourquoi il a choisi de ne pas renvoyer self lors d'opérations qui affectent l'objet et de n'en renvoyer aucun nouveau.

Cela provient d'un style de codage (populaire dans plusieurs autres langages, je crois que le LISP s'y adonne particulièrement bien), où une série d'effets secondaires sur un seul objet peut être chaînée de la manière suivante:

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

qui serait le même que

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

Je trouve que l'enchaînement constitue une menace pour la lisibilité; cela nécessite que le lecteur connaisse intimement chacune des méthodes. La seconde forme indique clairement que chacun de ces appels agit sur le même objet. Ainsi, même si vous ne connaissez pas très bien la classe et ses méthodes, vous pouvez comprendre que les deuxième et troisième appels sont appliqués à x (et que tous les appels sont faits pour leurs effets secondaires) et non pour autre chose.

Je voudrais réserver le chaînage pour les opérations qui renvoient de nouvelles valeurs, telles que les opérations de traitement de chaîne:

 y = x.rstrip("\n").split(":").lower()
55
Gonzalo Larralde

Python a deux sortes de tris: une méthode sort (ou "fonction membre") et une fonction sort . La méthode de tri agit sur le contenu de l'objet nommé - pensez-le comme une action entreprise par l'objet pour se réorganiser lui-même . La fonction de tri est une opération sur les données représentées par un objet et renvoie un nouvel objet avec le même contenu dans un ordre trié.

Étant donné une liste d'entiers nommée l, la liste elle-même sera réorganisée si nous appelons l.sort():

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

Cette méthode n'a pas de valeur de retour. Mais que se passe-t-il si nous essayons d’attribuer le résultat de l.sort()?

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

r n'équivaut plus à rien. C’est l’un de ces détails étranges et quelque peu ennuyeux qu’un programmeur est susceptible d’oublier après une période d’absence de Python (c’est pourquoi j’écris ceci, donc [~ # ~] i [~ # ~] n'oubliez plus).

La fonction sorted(), par contre, ne fera rien au contenu de l, mais renverra une nouvelle liste triée ayant le même contenu que 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]

Sachez que la valeur renvoyée est et non a copie intégrale , soyez donc prudent quant aux opérations ayant des effets secondaires sur les éléments contenus dans le fichier. liste comme d'habitude:

>>> 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]]
13
zxq9

Python retourne habituellement None à partir de fonctions et de méthodes qui mutent les données, telles que list.sort, list.append, et random.shuffle, l’idée étant que cela suggère qu’il était en train de muter.

Si vous voulez prendre un itératif et retourner une nouvelle liste triée de ses éléments, utilisez la fonction intégrée sorted.

12
Mike Graham

Pour comprendre pourquoi il ne retourne pas la liste:

sort () ne retourne aucune valeur avec.

La méthode sort () trie simplement les éléments d'une liste donnée dans un ordre spécifique - croissant ou décroissant sans renvoyer de valeur.

Donc, le problème est avec answer = newList.sort() où la réponse est nulle.

à la place, vous pouvez simplement faire return newList.sort()

La syntaxe de la méthode sort () est la suivante:

list.sort(key=..., reverse=...)

Alternativement, vous pouvez également utiliser la fonction intégrée de Python, sort (), dans le même but.

sorted(list, key=..., reverse=...)

Remarque: La différence la plus simple entre sort () et trié () est que: sort () ne renvoie aucune valeur alors que, sort () renvoie une liste itérable.

Donc, dans votre cas, answer = sorted(newList)

3
Projesh Bhoumik