PythonError:“ float”对象不可迭代

时间:2019-01-02 19:40:47

标签: python python-3.x

我正在尝试使用条件分隔RGB从txt文件的矢量列表中提取3个切片,分为2列。

但是,当我运行程序时,出现以下错误:“'float'对象不可迭代”。谁能帮我吗?

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

但是,当我尝试运行它时,会导致此错误:

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

请帮助我!

3 个答案:

答案 0 :(得分:2)

在此代码中

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

if测试中可以清楚地看出,您希望vetor_x[i]是一个数字;这是一个数字,因为否则会在if测试中出现运行时错误。

但是您正在为此号码呼叫list()。因此,我怀疑list(x)并没有达到您的预期。它实际上是将x的所有元素(可以是列表,元组或字符串或...)放入列表中。假设vetor_x[i] == 400.00000。然后您的代码正在执行list(400.00000)。这是没有意义的。

我想你可能打算

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

...但这只是一个猜测。

不能通过将值分配给不存在的元素来增加Python列表的长度。因此,如果vetor_xB为空列表,则分配vetor_xB[B] =将失败,因为与B的值无关,没有元素B:如果B == 0那么vetor_xB[B]vetor_xB[0]相同,并且由于没有元素零,尝试分配该元素将失败。

因此,要使列表更长,请改用append()。但是要追加到列表,该列表必须首先存在。您的代码未提供vetor_xB的起始值。在程序的顶部,必须有类似vetor_xB == []的东西。

答案 1 :(得分:2)

该错误表示此行vetor_xB[B] = list(vetor_x[i])无法将float值转换为列表,相反,您可能只想将float值附加到列表中,但是我们需要先定义这些列表,然后才能使用它们,像这样:

# 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])

然后您的输出应如您所愿:

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

注意: 可以简化读取文件的格式,请替换所有这些内容:

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

仅包含以下3行:

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

答案 2 :(得分:1)

如在第6行中定义的那样,

vetor_x绝对是可迭代的。这使vetor_xB成为错误的来源。我看不到它在任何地方定义。

根据对vetor_xB的使用,可以将其定义为循环之前某个地方的字典,然后调用vetor_xB.values()输出所需的列表。

或者(最好是),您可以将vetor_xB定义为列表,而不是vetor_xB[B]可以编写vetor_xB.append(B)。这似乎是更简单,更合乎逻辑的解决方案。

甚至更优选使用以下熊猫。这是一个更快,更有效的解决方案,并且确实消除了手动解析数据所花费的大量时间。在这里,整个文档将替换为6行代码+一些打印语句。它可能不是最高效的内存,但是它提供了一些重要的优势,我认为值得切换。

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)