1
votes

Erreur Python: l'objet 'float' n'est pas itérable

J'essaie de faire 3 tranches à partir d'une liste de vecteurs à partir d'un fichier txt, avec 2 colonnes, en utilisant des conditions pour séparer le RVB.

Mais lorsque j'exécute le programme, l'erreur suivante apparaît: "'float' l'objet n'est pas itérable ". Quelqu'un peut-il m'aider?

Traceback (most recent call last):
  File "teste4.py", line 30, in <module>
    vetor_xB[B] = list(vetor_x[i])
TypeError: 'float' object is not iterable

Cependant, lorsque j'essaie de l'exécuter, cela provoque cette erreur:

#File opening
arq = open('arquivo.txt','r')

lines = arq.readlines()
arq.close()

vetor_x = []
vetor_y = []
lista_geral = []

for line in lines:
    line = line.replace('\n','')
    line = line.strip()
    line = line.replace(',','.')
    line = line.split('\t')

    if(len(line) == 2):
        X = line[0]
        Y = line[1]
        vetor_x.append(float(X))
        vetor_y.append(float(Y))
        lista_geral.append([X,Y])

#Conditions
B = 0
G = 0
R = 0

for i in range(0,len(vetor_x)):

    if vetor_x[i] <= 500:
        vetor_xB[B] = list(vetor_x[i])
        vetor_yB[B] = list(vetor_y[i])
        B += 1

    elif vetor_x[i] <= 600:
        vetor_xG[G] = list(vetor_x[i])
        vetor_yG[G] = list(vetor_y[i])
        G += 1

    elif vetor_x[i] <= 700:
        vetor_xR[R] = list(vetor_x[i])
        vetor_yR[R] = list(vetor_y[i])
        R += 1

print('####### vetor_xB #######')
print(vetor_xB)
print('####### vetor_yB #######')
print(vetor_yB)
print('####### vetor_xG #######')
print(vetor_xG)
print('####### vetor_yG #######')
print(vetor_yG)
print('####### vetor_xR #######')
print(vetor_xR)
print('####### vetor_yR #######')
print(vetor_yR)

S'il vous plaît aidez-moi!


1 commentaires

vetor_xB [B] = list (vetor_x [i]) vous essayez de typer une valeur unique de vetor_x . Apparemment, c'est un flotteur.


3 Réponses :


2
votes

Dans ce code

if vetor_x[i] <= 500:
    vetor_xB.append(vetor_x[i])

il ressort clairement de votre if -test que vous vous attendez à ce que vetor_x [i] soit un nombre ; et c'est un nombre, car sinon vous auriez une erreur d'exécution sur le if-test.

Mais alors vous appelez list () sur Ce nombre. Je soupçonne donc que list (x) ne fait pas ce que vous pensez qu'il fait. En fait, il prend tous les éléments de x (qui peuvent être une liste ou un tuple ou une chaîne ou ...) et les place dans une liste. Supposons que vetor_x [i] == 400,00000 . Ensuite, votre code fait list (400.00000) . Ça n'a aucun sens.

Je pense que vous pouvez avoir l'intention

if vetor_x[i] <= 500:
    vetor_xB[B] = list(vetor_x[i])

... mais ce n'est qu'une supposition.

Vous ne pouvez pas allonger une liste Python en attribuant des valeurs à des éléments qui n'existent pas. Donc, si vetor_xB est une liste vide, alors l'affectation de vetor_xB [B] = échouera, car quelle que soit la valeur de B , il n'y a pas élément B : si B == 0 alors vetor_xB [B] est le même que vetor_xB [0] , et essayer d'attribuer cela échouera car il n'y a pas d'élément zéro.

Donc, pour allonger la liste, utilisez plutôt append () . Mais pour ajouter à une liste, la liste doit d'abord exister. Votre code ne fournit pas de valeur de départ pour vetor_xB . En haut du programme, il doit y avoir quelque chose comme vetor_xB == [] .


0 commentaires

2
votes

L'erreur signifie que cette ligne vetor_xB [B] = list (vetor_x [i]) , ne peut pas convertir les valeurs float en une liste, à la place vous veulent probablement simplement ajouter les valeurs float à vos listes, mais nous devons définir ces listes avant de pouvoir les utiliser, comme ceci:

for line in lines:
    line = line.replace(',','.')
    line = line.strip().split()

Alors votre sortie devrait soyez comme vous le souhaitez:

for line in lines:
    line = line.replace('\n','')
    line = line.strip()
    line = line.replace(',','.')
    line = line.split('\t')

Remarque: Le formatage de la lecture du fichier peut être simplifié, remplacez tout cela:

####### vetor_xB #######
[400.0, 401.10373, 409.54288, 425.24905, 442.71341, 470.96112, 488.7771, 499.79489, 499.91208, 500.0]
####### vetor_yB #######
[46.5713, 42.8136, 103.12, 12.6044, 262.43, 680.958, 171.28, 39.846, 41.1616, 39.2299]
####### vetor_xG #######
[523.70581, 540.81854, 579.26355, 593.3288, 600.0]
####### vetor_yG #######
[38523.1, 31554.2, 243.866, 90.6795, 212.789]
####### vetor_xR #######
[602.58838, 618.64624, 630.01563, 655.33307, 669.74994, 686.74548, 698.11487, 700.0]
####### vetor_yR #######
[251.602, 367.089, 3568.19, 44230.4, 7747.32, 768.864, 1229.72, 1808.8]

par juste ces 3 lignes:

# Define the lists we want to append the data to
vetor_xB = []
vetor_yB = []
vetor_xG = []
vetor_yG = []
vetor_xR = []
vetor_yR = []

for i in range(len(vetor_x)):
    if vetor_x[i] <= 500:
        vetor_xB.append(vetor_x[i])
        vetor_yB.append(vetor_y[i])

    elif vetor_x[i] <= 600:
        vetor_xG.append(vetor_x[i])
        vetor_yG.append(vetor_y[i])

    elif vetor_x[i] <= 700:
        vetor_xR.append(vetor_x[i])
        vetor_yR.append(vetor_y[i])

p >


0 commentaires

1
votes

vetor_x est définitivement itérable comme indiqué lorsque vous le définissez à la ligne 6. Cela laisse vetor_xB comme source de votre erreur. Je ne le vois défini nulle part.

À partir de votre utilisation de vetor_xB , vous pouvez le définir comme un dictionnaire quelque part avant votre boucle et appeler vetor_xB.values ​​() pour afficher la liste souhaitée.

Alternativement (et de préférence), vous pouvez définir vetor_xB comme une liste et au lieu de vetor_xB [B] vous pouvez écrire vetor_xB.append (B) . Cela semble la solution la plus simple et la plus logique.

Et encore plus préférablement, utilisez les pandas comme ci-dessous. Il s'agit d'une solution beaucoup plus rapide et efficace qui supprime honnêtement une grande partie du temps nécessaire pour analyser manuellement vos données. Ici tout le document est remplacé par 6 lignes de code + quelques instructions d'impression. Ce n'est peut-être pas le plus efficace en termes de mémoire, mais il offre des avantages significatifs qui, à mon avis, valent la peine d'être remplacés.

df = pd.read_csv(archive_path, sep='   ', header=None)

for col in df.columns: df[col] = pd.to_numeric(df[col].str.replace(',','.'))

df.columns = ['X', 'Y']

vetores = {}
vetores['vetor_B'] = df.loc[df['X']<=500]
vetores['vetor_G'] = df.loc[(df['X']>500) & df['X']<=600]
vetores['vetor_R'] = df.loc[(df['X']>600) & df['X']<=700]

for vetor in vetores.keys():
    print(vetor+'X:')
    print(vetores[vetor]['X'])
    print(vetor+'Y:')
    print(vetores[vetor]['Y'])
    print('-'*40)


0 commentaires