Python 如何调试此错误';浮动';对象不可编辑?
我试图计算列表中数字的平均值,我应该跳过第一个观察值(即位置0),因为它们是国家的名称,我只需要计算Python 如何调试此错误';浮动';对象不可编辑?,python,Python,我试图计算列表中数字的平均值,我应该跳过第一个观察值(即位置0),因为它们是国家的名称,我只需要计算[0]之后每列的平均值。 然而,我的代码一直在说: TypeError:“float”对象不可编辑 如果有人能看一看并提供一些帮助,我将不胜感激。谢谢大家! p、 s我不能使用numpy或pandas test_list = [['name1', 6.039330006, 0, 0.00, 67.53870392, 0.831966162, -0.186299905, None], ['name2
[0]
之后每列的平均值。
然而,我的代码一直在说:
TypeError:“float”对象不可编辑
如果有人能看一看并提供一些帮助,我将不胜感激。谢谢大家!
p、 s我不能使用numpy
或pandas
test_list = [['name1', 6.039330006, 0, 0.00, 67.53870392, 0.831966162, -0.186299905, None], ['name2', 4.287736416, 9.034710884, 0.697924912, 65.12568665, 0.613697052, -0.132166177, 0.00001]]
定义我的意思(文件):
#此函数用于计算文件中每列的平均值
平均值列表=[]
对于范围(0,len(文件))中的行:
对于范围(1,len(文件[0])中的列:
如果文件[行][列]!=无:
平均值=stat.mean(文件[行][列])
#平均值=总和(文件[行][列])/len(1,文件[行][列])
平均值列表。追加(平均值)
打印(“平均值为{0}”。格式(平均值列表))
使用类似的代码,我可以得到:
最小值为
[-0.186299905,0.24690991]
对于测试列表中的两列
对于数据的每一列,我们构建一个包含值的列表,过滤掉无
值,并将其传递给平均值
:
import statistics
def my_mean(file):
# This function calculates the mean value of each column in the file
mean_list = [ ]
for column in range(1,len(file[0])):
column_values = (row[column] for row in file)
mean_list.append(statistics.mean(val for val in column_values if val is not None))
return mean_list
test_list = [['name1', 6.039330006, 0, 0.00, 67.53870392, 0.831966162, -0.186299905, None], ['name2', 4.287736416, 9.034710884, 0.697924912, 65.12568665, 0.613697052, -0.132166177, 0.00001]]
print(my_mean(test_list))
# [5.163533211000001, 4.517355442, 0.348962456, 66.33219528500001, 0.722831607, -0.159233041, 1e-05]
您还可以使用zip
构建列列表,然后计算列表中的平均值:
import statistics
def my_mean(file):
columns = list(zip(*file))[1:]
mean_list = [statistics.mean(val for val in column if val is not None) for column in columns]
return mean_list
test_list = [['name1', 6.039330006, 0, 0.00, 67.53870392, 0.831966162, -0.186299905, None], ['name2', 4.287736416, 9.034710884, 0.697924912, 65.12568665, 0.613697052, -0.132166177, 0.00001]]
print(my_mean(test_list))
# [5.163533211000001, 4.517355442, 0.348962456, 66.33219528500001, 0.722831607, -0.159233041, 1e-05]
那么:
test_list = [['name1', 6.039330006, 0, 0.00, 67.53870392, 0.831966162, -0.186299905, None],
['name2', 4.287736416, 9.034710884, 0.697924912, 65.12568665, 0.613697052, -0.132166177, 0.00001]]
它给出:
结果
[5.16353211000001,9.034710884,0.697924912,66.33219528500001,0.722831607,-0.159233041,1e-05]如果我遵循你的方法,我会这样做:
def my_mean(file):
mean_list = []
for row in range(len(file)):
temp_column = []
for column in range(len(file[row])):
if isinstance(file[row][column], (int, float)):
temp_column.append(file[row][column])
mean_value = sum(temp_column) / len(temp_column)
mean_list.append(mean_value)
print("The mean values are {0}".format(mean_list))
欢迎来到SO!请给我们看一下回溯,以及你是如何调用你的函数的。请给我们看一个。@YasinYousif,它将排除等于0的值,这将改变平均值。非常感谢,它适用于测试列表,但您知道为什么它会对作为函数内变量的列表产生此错误吗?TypeError:“@Thierrylahuille,没错,。。我想我讨厌使用像
None==None
这样的公式,我觉得它总是会随着版本的不同而变化。。(在javascript中,这是用来制造麻烦的)。所以,在我有限的知识范围内,不使用它们更安全@这个错误一定发生在你代码的其他部分,这里没有比较。如果你不设法解决它,你可以问另一个问题@YasinYousif使用None
在Python中是非常安全的。如中所述,“此类型有一个值。有一个具有此值的对象。此对象通过内置名称None访问。它用于表示在许多情况下没有值,例如,它是从没有显式返回任何内容的函数返回的。”。测试一个值是否为None
的传统方法是如果值为None:
,从而测试两者是否是同一个对象。mean([0,2])
返回2.0
,这肯定是错误的。@Thierrylahuille,注意到谢谢,你知道它不迭代浮动值的原因吗?是的,在您的代码中,您有stat.mean(文件[行][列])
,它是一个浮点数,一个单一的数字。为了计算平均值,您需要sum()
并除以len()
,为了从len()
中得到答案,您需要遍历这些项,但是当你传递一个对象时,你不能对它进行迭代。好吧,这可能与我在传递函数中定义的列表/变量时遇到的TypeError:无法将类型“str”转换为分子/分母
错误有关?关于这一点,你可能需要阅读:
def my_mean(file):
mean_list = []
for row in range(len(file)):
temp_column = []
for column in range(len(file[row])):
if isinstance(file[row][column], (int, float)):
temp_column.append(file[row][column])
mean_value = sum(temp_column) / len(temp_column)
mean_list.append(mean_value)
print("The mean values are {0}".format(mean_list))