L'exécution de ma fonction frisbeeSort () entraîne toujours le tri de la liste, mais chaque élément étant dans une liste imbriquée. Je voudrais modifier récursivement la liste d'origine au lieu d'utiliser une liste temporaire.
[1, [12, [12, [13, [34, [42, [45, [76, [98, 234]]]]]]]]]
J'attends
[1, 12, 12, 13, 34, 42, 45, 76, 98, 234]
mais je continue de recevoir p>
def frisbeeSort(n):
index = n.index(min(n))
if len(n) == 1:
return n[0]
else:
n[0:index + 1] = n[index::-1]
n = [n[0], frisbeeSort(n[1:])]
return n
list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1]
3 Réponses :
Vous renvoyez un élément, pas une liste lorsque len (n) == 1 . Vous concaténez également les deux listes de manière incorrecte. Essayez ceci:
[1, 12, 12, 13, 34, 42, 45, 76, 98, 234]
résultat:
def frisbeeSort(n):
index = n.index(min(n))
if len(n) == 1:
return [n[0]]
else:
n[0:index + 1] = n[index::-1]
n = [n[0]] + frisbeeSort(n[1:])
return n
list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1]
print(frisbeeSort(list1))
Lorsque vous écrivez [n [0], frisbeeSort (n [1:])] , cela crée une liste à deux éléments dans laquelle le premier élément est n [0] < / code> et le second est la valeur renvoyée par frisbeeSort (n [1:]) (qui est une liste). Si vous souhaitez les joindre dans une liste plate, vous pouvez écrire [n [0]] + frisbeeSort (n [1:]) .
Je voudrais modifier récursivement la liste d'origine au lieu d'utiliser un liste temporaire
Bien que la réponse acceptée résout le problème de la "liste imbriquée", je ne pense pas qu'elle réponde aux attentes ci-dessus. Autrement dit, si vous faites:
n[start:index + 1] = n[start:index + 1][::-1]Vous obtenez:
index = n.index(min(n[start:]), start)Où se trouve
list1modifié mais reste non trié. Voici une façon de résoudre le problème du tri de la liste sur place à l'aide de l'algorithme de l'OP:frisbeeSort(n, start + 1)OUTPUT
def frisbeeSort(n, start=0):pourriez-vous s'il vous plaît expliquer ce qui change exactement la liste d'origine au lieu de renvoyer une liste triée?
Il y a deux choses qui permettent que cela se produise. Tout d'abord, le second argument
start(par défaut):> python3 test.py [1, 12, 12, 13, 34, 42, 45, 76, 98, 234] >qui nous permet de conserver les éléments initiaux qui sont triés lors de l'appel récursif: p>
def frisbeeSort(n, start=0): if start < len(n): index = n.index(min(n[start:]), start) n[start:index + 1] = n[start:index + 1][::-1] frisbeeSort(n, start + 1) list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1] frisbeeSort(list1) print(list1)et nous indique par où commencer notre nouvelle recherche minimale:
> python3 test.py [1, 12, 12, 13, 34, 42, 45, 76, 98, 234] [1, 234, 98, 13, 45, 76, 12, 34, 42, 12] >etc. Deuxièmement, l'affectation de nouveau dans le tableau lui-même:
list1 = [12, 42, 34, 12, 76, 45, 13, 98, 234, 1] print(frisbeeSort(list1)) print(list1)Nous remplaçons les éléments non triés restants par les mêmes valeurs inversées. Le tableau temporaire de droite est jeté et l'original est mis à jour.
pourriez-vous s'il vous plaît expliquer ce qui change exactement la liste originale au lieu de renvoyer une liste triée?
@ IonicGolem36, j'ai ajouté quelques explications à ce sujet à ma réponse - faites-moi savoir si vous avez encore des questions.