3 votes

Python : index de liste hors plage (Assignation d'une liste 2D à une autre liste 2D)

Je traite une liste 2D et je veux stocker la liste 2D traitée dans une nouvelle liste 2D avec les mêmes index. Mais je reçois l'erreur "list index out of range".

J'ai simplifié mon code pour qu'il soit facile à comprendre :

a = [
    ['a', 'b'],
    ['c', 'd']
]
print a

b = []
for i in range(len(a)):
    for j in range(len(a[i])):
        if a[0][0] == 'a':
            a[0][0] = 'b'
        else:
            b[i][j] = a[i][j] #list index out of range

Remerciements

1voto

Brendan Donegan Points 67

C'est simple, vous avez initialisé b à [], donc toute tentative d'accès par l'index sera hors de portée. Les listes en Python peuvent augmenter en taille dynamiquement, mais ce n'est pas la façon de le faire. Vous avez besoin de .append

1voto

Md Mahfuzur Rahman Points 1814

Je n'ai aucune idée du résultat que vous attendez. Je viens de corriger l'erreur. Au début append un vide list a b vous pouvez alors accéder à b[i] et ainsi de suite.

Code :

a = [
    ['a', 'b'],
    ['c', 'd']
]
print(a)

b = []
for i in range(len(a)):
    b.append([]) #Append an empty list to `b`
    for j in range(len(a[i])):
        if a[0][0] == 'a':
            a[0][0] = 'b'
        else:
            b[i].append(a[i][j]) #No error now

print(b)

1voto

Michel Touw Points 525

Au b[i][j] vous essayez d'accéder au jème élément du ème élément. Cependant, b n'est qu'une liste vide, donc le ième élément n'existe pas, et encore moins le jième élément de ce ième élément.

Vous pouvez y remédier en ajoutant les éléments à b. Mais d'abord, une liste (ligne) doit être créée (ajoutée à b) pour chaque liste (ligne) dans a.

L'exemple suivant utilise la fonction enumerate fonction. Elle renvoie l'index et l'élément, donc si vous le souhaitez, vous pouvez toujours faire des choses avec i et j, mais cela vous empêchera d'obtenir une valeur de IndexError . Vous pouvez toujours utiliser en toute sécurité a[i][j] car les indices sont dérivés de a .

a = [
    ['a', 'b'],   
    ['c', 'd']
]
b = []
for i, row in enumerate(a):             # loop over each list (row) in a
    b_row = []                          # list (row) which will be added to b
    for j, element in enumerate(row):   # loop over each element in each list (row) in a
        if a[0][0] == 'a':              # Not sure why each the first element of a has to be checked each loop    # Probably a simplification of the operations.
            a[0][0] = 'b'
        else:
            b_row.append(element)        # append the element to the list(row) that will be added to b
    b.append(b_row)                      # When the row is filled, add it to b

print(b)

Un dernier commentaire : il n'est pas recommandé de modifier une liste tout en la parcourant en boucle en Python (comme dans la fonction if ). Il est préférable d'appliquer ces changements à votre liste de sortie, qui est b. S'il s'agit simplement d'une simplification du processus, ignorez cette remarque.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X