web-dev-qa-db-fra.com

Affectation de valeurs à un tableau avec for Loop Python

J'essaie d'assigner les valeurs d'une chaîne à différents index de tableau 

mais j'obtiens une erreur appelée "affectation de liste hors de portée"

uuidVal = ""
distVal = ""
uuidArray = []
distArray = []

for i in range(len(returnedList)):
     for beacon in returnedList:
            uuidVal= uuidVal+beacon[:+2]
            uuidArray[i]= uuidVal
            distVal= distVal+beacon[-2:]
            distArray[i]= distVal
            uuidVal=""
            disVal=""

J'ai essayé d'utiliser 

distArray[i].append(distVal)

au lieu de 

distArray[i]= distVal

mais il a donné une erreur appelée "index de liste hors de portée"

En utilisant 

distArray.append(distVal)

fait fonctionner sans erreur mais le résultat était mauvais

car il continue à concaténer la nouvelle valeur attribuée avec les anciennes valeurs de l'index suivant

Comment cela devrait-il fonctionner:

returnList [ '52: 33: 42: 40: 94: 10: 19, -60 ', '22: 34: 42: 24: 89: 70: 89, -90' , '87: 77: 98: 54: 81: 23: 71, -81 ']

à chaque itération, il attribue le premier caractère à uuidVal (ex: 52, 22, 87) et les deux derniers caractères à distVal (ex: 60, 90, 81)

à la fin uuidArray devrait avoir ces valeurs [52, 22, 87]

et distArray devrait avoir ces valeurs [60, 90, 81]

Remarque: utilisez .append concaténer les valeurs, par exemple si utilisé avec distArray like distArray.append (distVal) les valeurs seront comme ceci [60, 6090 , 609081]

3
AMS91

oui, vous obtiendrez un index de liste d'erreurs hors limites pour:

distArray[i] = distVal

vous accédez à l'index qui n'est pas encore créé

permet de voir cette démo:

>>> a=[]   # my list is empty 
>>> a[2]    # i am trying to access the value at index 2, its actually not present
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: list index out of range

votre code devrait être comme ça:

uuidArray = []
distArray = []
distVal = ""
for beacon in returnedList:
        uuidArray.append(beacon[:2])
        distval += beacon[-2:]
        distArray.append(distVal)

la sortie sera uudiArray: ['52', '22', '87'] et distArray: ['60', '6090', '609081']

6
Hackaholic

Lorsque vous définissez distArray comme suit: distArray = []

Vous initialisez une liste avec 0 élément. distArray[2] renvoie correctement une erreur, car vous tentez d'accéder à un élément au-delà de la longueur totale du tableau. 

Il y a deux façons de gérer cela: 

  1. Utilisez append. Ceci prend la liste et l'étend de l'élément contenu dans l'appel de fonction. Ceci doit être préféré pour tous sauf les occasions les plus rares, imo. 
  2. Définir explicitement une liste vide. Cela peut être fait en utilisant quelque chose comme: distArray = [0]*num_elements, où num_elements est le nombre d'éléments que vous souhaitez avoir. Cela créera une liste de taille num_elements, toutes égales à 0. 
1
dave
def array():
    a = []
    size = int(input("Enter the size of array: "))

    for i in range(size):
        b = int(input("enter array element: "))
        a.append(b)
    return a
0
Tanuja Shelke

D'autres ont déjà expliqué l'erreur, je vais donc laisser mon 2c sur la façon de résoudre ce problème. Tout d’abord, vous pouvez utiliser du pur Python:

distArray = [None for _ in xrange(max_value+1)]

J'utilise des objets de type None pour allouer le tableau (alors que beaucoup de gens préfèrent les zéros) car ils ne peuvent pas être interprétés comme un entier ou un bool. 

Si votre processus nécessite beaucoup de RAM, vous devriez mieux utiliser les tableaux numpy. Et il existe un moyen très efficace de créer un tableau vide numpy.

import numpy as np

distArray = np.empty(max_value+1, dtype=str)

Notez que vous devez sélectionner manuellement un type de données.

Ce que vous essayez de réaliser est fondamentalement un hash-map/table simplifié. Si vous n'êtes pas sûr de la valeur maximale, vous pouvez envisager d'écrire votre propre tableau 'dynamique', dont la taille augmentera, si elle est appelée en dehors de ses frontières, au lieu de générer une erreur.

class DistArray():
    def __init__(self, starting_size):
        self.arr = [None for _ in xrange(starting_size)]

    def __getitem__(self, i):
        return self.arr[i]

    def __iter__(self):
        return iter(self.arr)

    def insert_item(self, item, value):
            try:
                self.arr[value] = item
            except:
                self.arr.extend([None for _ in xrange(value - len(self.arr))])
                self.arr[value] = item

Cette chose va s'adapter à vos besoins.

distArray = DistArray(starting_size)
distArray.insert_item(string, value)
0
Eli Korvigo