我有一个这种格式的文件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的新手,所以也许我在列表工作方式中遗漏了一些东西?如果我可以为步骤01得到像[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”已经是整数,没有......?或者这是指“项目”?我觉得我现在比以前更困惑了。
答案 0 :(得分: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
将包含您想要的格式的列表。
答案 1 :(得分: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])
答案 2 :(得分: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]))