我有一些杂乱的数据,我正在通过一个函数。下面的函数试图取平均值。有时列表中的项目不是数字,会引发错误。
我尝试使用正则表达式替换非数字字符,但有些东西仍在使用。任何时候出现错误值(由于数据混乱)我只想在列表中记录该项目的0。
def mean(vals):
if len(vals) == 0:
return 0.0
for val in vals:
val = re.sub("[^0-9.]", "", str(val))
print vals
vals = [float(val) for val in vals]
return sum(vals) / len(vals)
我正在打印val列表,只是为了看看我在哪里抛出错误。最后一个vals列表是:
['</a>']
这是怎么可能的,因为我已经将所有不是数字或句号的东西都复制了?
答案 0 :(得分:1)
您不会更改vals
的值(请参阅Modification of the list items in the loop (python))
val = re.sub("[^0-9.]", "", str(val))
相反,您可以遍历列表的索引并直接更改其内容。
答案 1 :(得分:1)
使用re.sub
/ try
...
except
def mean(vals):
total = 0.0
length = 0
for val in vals:
try:
total += float(val)
except (ValueError, TypeError):
pass
length += 1
return total / length if length else 0.0
答案 2 :(得分:1)
您没有在for循环中更改列表,只是在循环范围内设置一个不会反映在列表中的变量。
要更改列表,您应该执行以下操作:
>>> vals = [re.sub("[^0-9.]", "", str(val)) for val in vals]