又一个关于Python列表CSV文件的问题
我有一个CSV格式的文件,想要计算每一步的平均值:
elapsed,label
120,Step 01
260,Step 02
113,Step 03
100,Step 01
200,Step 02
103,Step 03
但是我在弄清楚列表方面遇到了困难。我正在使用的Python脚本是:
for file in sys.argv[1:]:
for row in csv.DictReader(open(file)):
label = row['label']
elapsed = row['elapsed']
print elapsed,label
我尝试过
label.append(row['elapsed'])
和 label.append('elapsed')
,但每次都会出现这个错误
AttributeError: 'str' object has no attribute 'append'
我不太确定怎么解决这个错误。我刚开始学Python,可能对列表的用法还不太了解。如果我能得到像[120,100]这样的列表用于第一步,我就可以很容易地计算总和和平均值,但我现在卡在了创建列表这一步。
编辑:result
列表的总和
现在,我有这个:
for item in result:
for n in result[item]:
int(n)
print sum(float(result[item][n]))
但出现了这个错误
TypeError: list indices must be integers, not str
但是“n”已经是一个整数了,不是吗?还是说这是指“item”?我觉得我现在比之前更困惑了。
3 个回答
0
(这是代表提问者发布的解决方案).
非常感谢 @Pablo、@agf 和 @ms4py。你们的建议让我找到了这个解决办法。
result = dict()
av = []
idx = []
for file in sys.argv[1:]:
for row in csv.DictReader(open(file)):
label = row['label']
elapsed = row['elapsed']
if label in result:
result[label].append(elapsed)
else:
result[label] = [elapsed]
for i in sorted (result.iterkeys()):
s = sum(int(v) for v in result[i])
a = s/float(len(result[i]))
3
我觉得这个代码应该能实现你想要的效果:
result = dict()
for file in sys.argv[1:]:
for row in csv.DictReader(open(file)):
label = row['label']
elapsed = float(row['elapsed'])
if label in result:
result[label].append(elapsed)
else:
result[label] = [elapsed]
totals = dict((label, sum(values)) for label, values in result.iteritems())
执行完这个代码后,result
里会包含你想要的格式的列表。
2
如果你想要制作列表,
from collections import defaultdict
steps = defaultdict(list)
for file in sys.argv[1:]:
for row in csv.DictReader(open(file)):
steps[row['label']].append(row['elapsed'])
averages = dict((key, sum(value)) for key, value in steps.iteritems())
这段代码会给你计算平均值。
你现在做的事情是试图把 row['elapsed']
里的字符串加到 label
里的字符串上,但字符串是不可变的,不能直接添加。你可以用 string1 + string2
或者 `''.join((string1, string2))` 来把它们连接起来。
补充说明:关于你新的错误,看看我代码的最后一行,或者试试:
averages = {}
for item in result.iteritems():
print item[0], sum(item[1])