我正在尝试使用条件分隔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
请帮助我!
答案 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)
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)