对一些混乱的数据进行迭代和平均

时间:2015-06-05 19:58:29

标签: python regex python-2.7

我有一些杂乱的数据,我正在通过一个函数。下面的函数试图取平均值。有时列表中的项目不是数字,会引发错误。

我尝试使用正则表达式替换非数字字符,但有些东西仍在使用。任何时候出现错误值(由于数据混乱)我只想在列表中记录该项目的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>']

这是怎么可能的,因为我已经将所有不是数字或句号的东西都复制了?

3 个答案:

答案 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]