TypeError:float()参数必须是字符串或带有列表总和的数字

时间:2016-04-14 14:49:51

标签: python list

我想读取txt文件并汇总所有列表元素

with open('beautm.txt') as f:
    p = []
    for line in f:
        line = line.split()         
        line = [float(i) for i in line]
        p.append(line)

print p
print type(p)     
print sum(map(float,p))

这应该很简单,但是

[[729000.0, 243000.0, 81000.0, 27000.0, 9000.0, 3000.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0, 500.0], [3000.0, 9000.0, 27000.0, 81000.0, 243000.0, 729000.0]]
<type 'list'>
Traceback (most recent call last):
  File "mk4.py", line 10, in <module>
    print sum(map(float,p))
TypeError: float() argument must be a string or a number

4 个答案:

答案 0 :(得分:2)

此处的主要问题是将列表附加到列表中:

>>> p = []
>>> p.append(l)
>>> p
[[1, 2, 3]]
>>> p.append(l)
>>> p
[[1, 2, 3], [1, 2, 3]]

因此,作为对代码的修复,请改为使用list.extend

>>> p = []
>>> l = [1,2,3]
>>> p.extend(l)
>>> p
[1, 2, 3]
>>> p.extend(l)
>>> p
[1, 2, 3, 1, 2, 3]

答案 1 :(得分:1)

看起来p是一个列表列表。 p的每个元素都是line,由列表推导[float(i) for i in line]构成。这就是为什么你不能在它上面执行float的原因

答案 2 :(得分:1)

如前所述,您正在尝试将float应用于列表。但是我不确定你是否想要每个子列表的总和或总和。无论哪种方式:

如果你想对所有列表中的所有内容求和,你可以在求和之前将它们链接起来:

from itertools import chain
print sum(map(float, chain(*p)))

如果你想要每个列表的个别总和,你可以这样说:

print [sum(map(float, sublist)) for sublist in p]

对于p,输出如下:

# Total sum
2265000.0
# Sums per each list
[1093000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 4000.0, 1092000.0]

如果您确实需要总计,还可以将循环中的.append行更改为: p += line

答案 3 :(得分:1)

或者您可以在循环中进行求和而不构建不必要的列表:

with open('beautm.txt') as f:
    p = 0
    for line in f:
        line = line.split()         
        p += sum([float(i) for i in line])

print p