0
votes

"IndexError: index de liste hors de portée" lors de l'échange d'éléments dans une liste

Je dois écrire une fonction 'Swaplist' qui procède aux éléments suivants:

donnés dans l'entrée 2 listes:

list1, list2

tel que:

[S4, S6]

[4,2,3,6,5]

* Gardez à l'esprit [S5] ne peut pas être donné en entrée

retourne une liste dans laquelle 4 est échangé avec le numéro suivant et 6 est échangé avec le numéro suivant

[2,4,3,5,6]

Ceci est le code que j'ai écrit: xxx

J'ai essayé d'exécuter ce code et j'ai eu l'erreur suivante:

IndexError: index de liste hors de portée

Est-ce que quelqu'un sait comment résoudre ce problème?

Merci pour votre temps

  • et désolé pour mon anglais cassé

0 commentaires

3 Réponses :


0
votes

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

mais un autre problème se produit: en définissant simplement la liste = list2 code> Vous ne créez pas vraiment une nouvelle liste. List3 et List2 pointe vers la même liste. P>

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


0 commentaires

1
votes

Vous modifiez la liste en itération sur celui-ci, ce qui entraînera un comportement indésirable.

Si nous faisons un imprimé (list3) code> pour chaque fois que nous échangeons un numéro, nous pouvons voir ce qui se passe. à la liste en boucle. P>

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 [4, 2, 3, 5, 6] code> et est maintenant [2, 4, 3, 5, 6] code>. P>

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>

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


0 commentaires

0
votes

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


0 commentaires