Je dois écrire une fonction 'Swaplist' qui procède aux éléments suivants:
donnés dans l'entrée 2 listes: p>
list1, list2 p>
tel que: p>
[S4, S6] P>
[4,2,3,6,5] p>
* Gardez à l'esprit [S5] ne peut pas être donné en entrée p >
retourne une liste dans laquelle 4 est échangé avec le numéro suivant et 6 est échangé avec le numéro suivant P>
[2,4,3,5,6] p>
Ceci est le code que j'ai écrit: p> J'ai essayé d'exécuter ce code et j'ai eu l'erreur suivante: p> Est-ce que quelqu'un sait comment résoudre ce problème? P> Merci pour votre temps P> IndexError: index de liste hors de portée CODE> P>
3 Réponses :
Ceci ressemble à un problème de devoirs.
Le problème est que vous changez la même liste que celle que vous itre itération. Une première étape de la solution est de boucler à travers la liste2 et de faire les modifications de la liste3. De cette façon, la première fois que vous rencontrez mais un autre problème se produit: en définissant simplement la liste Pour voir ce qui se passe, vous pouvez parcourir votre code avec le débogueur. Comme il s'agit d'un code plutôt court, vous pouvez également ajouter des instructions 4 code>, vous l'échangez vers la droite. Mais ensuite, l'élément suivant que vous rencontrez dans List3 est à nouveau
4 CODE>, et vous l'échangez à nouveau. Cela continue à aller jusqu'à atteindre la fin de la liste3 avec une erreur tente d'échanger
4 code> au-delà de la fin. P>
= list2 code> Vous ne créez pas vraiment une nouvelle liste. List3 et List2 pointe vers la même liste. P>
Imprimer code> Afficher les valeurs des variables et la liste. Par exemple: P>
def swaplist(list1,list2):
list3=[i for i in list2]
for i in list2: # note we are looping through list2 and changing list3
print("i:", i)
if ('s'+str(i)) in list1:
a=list3.index(i)
b=a+1
list3[a],list3[b]=list3[b],list3[a]
print('s' + str(i), a, b, "list is now:", list3)
return list3
Vous modifiez la liste en itération sur celui-ci, ce qui entraînera un comportement indésirable.
Si nous faisons un Après avoir inspecté le premier numéro de la liste, nous voyons qu'il s'agit d'un 4, qui devrait être échangé. La liste était Passons sur le deuxième numéro dans la liste. Parce que vous avez modifié la liste d'origine, le deuxième numéro est maintenant 4, qui sera échangé avec le numéro suivant. P> C'est ce que le programme s'imprime après chaque swap: P> imprimé (list3) code> pour chaque fois que nous échangeons un numéro, nous pouvons voir ce qui se passe. à la liste en boucle. P>
[4, 2, 3, 5, 6] code> et est maintenant
[2, 4, 3, 5, 6] code>. P>
def swaplist(list1,list2):
# Make a copy of the original list so we don't modify it.
# Use a more verbose name for the list so it's clear what the purpose is
result_list=list2.copy()
# Use enumerate to get both the index (i), as well as the list item in one go.
for i, item in enumerate(list2):
if ('s'+str(item)) in list1:
# Swap the values using the original list as source.
result_list[i],result_list[i+1]=list2[i+1],list2[i]
return result_list
Comme mentionné par Johanc, le problème est que vous modifiez la liste sur laquelle vous bouclez. Vous pouvez copier la première liste2, puis modifier uniquement la liste3.
def swaplist(list1,list2): list3=list2.copy() for i in list2: print(i) if f's{i}' in list1: a=list3.index(i) b=a+1 list3[a],list3[b]=list3[b],list3[a] return list3