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
list.sort
trie la liste en place, c’est-à-dire qu’elle ne renvoie pas de nouvelle liste. Ecrivez
newList.sort()
return newList
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)
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()
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]]
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
.
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)