又一个关于Python列表CSV文件的问题

0 投票
3 回答
769 浏览
提问于 2025-04-16 22:23

我有一个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])

撰写回答