2

你好我有一个我希望是一个容易解决的问题。我正在尝试读取 csv 文件并将一部分写入列表。我需要确定每行中的索引和值,然后进行汇总。

所以该行将有 32 个值...每个值都是一个分类(0 类、1 类等),并带有一个与之关联的数字。我需要一个 pythonic 解决方案来完成这项工作。

import os,sys,csv
csvfile=sys.argv[1]
f=open(csvfile,'rt')
reader=csv.reader(f)
classes=[]
for row in reader:
  classes.append(row[60:92])
f.close()

classes = [' ', '1234', '645', '9897'],  [' ', '76541', ' ', '8888']

我将如何从每个列表中提取索引值以获得每个列表的总和?例如: 0=(' ', ' ') 1=('1234', '76541') 2= ('645', ' ') 3= ('9897', '8888') 然后求每个之和

class 0 = 0
class 1 = 77775
class 2 = 645
class3 = 18785

任何帮助将不胜感激

4

3 回答 3

1

我发现您的用例有点难以理解,但是这个列表理解是否为您提供了一些关于如何解决问题的新想法?

>>> classes = [' ', '1234', '645', '9897'],  [' ', '76541', ' ', '8888']
>>> [sum(int(n) for n in x if n != ' ') for x in zip(*classes)]
[0, 77775, 645, 18785]
于 2012-10-11T01:30:37.223 回答
0

您可以在浏览 CSV 文件行时求和。(例如,将 for class_ 循环放入您的行循环中)..:

>>> classes
[[' ', '1234', '645', '9897'], [' ', '76541', ' ', '8888']]
>>> sums = {}
>>> for row in classes:
...     for class_, num in enumerate(row):
...         try:
...             num = int(num)
...         except ValueError:
...             num = 0
...         sums[class_] = sums.get(class_, 0) + num
...
>>> sums
{0: 0, 1: 77775, 2: 645, 3: 18785}
于 2012-10-11T04:38:51.727 回答
0
>>> classes = [[' ', '1234', '645', '9897'],  [' ', '76541', ' ', '8888']]
>>> my_int = lambda s: int(s) if s.isdigit() else 0
>>> class_groups = dict(zip(range(32), zip(*classes)))
>>> class_groups[1]
('1234', '76541')
>>> class_sums = {}
>>> for class_ in class_groups:
...     group_sum = sum(map(my_int, class_groups[class_]))
...     class_sums[class_] = group_sum
...
>>> class_sums[1]
77775
>>> class_sums[3]
18785
>>>
于 2012-10-11T04:31:35.573 回答