python 3:使用标题键添加.csv列加入字典

时间:2014-11-19 01:14:13

标签: python csv python-3.x dictionary sum

我有一个.csv文件,如下所示:

name1 name2 name3
value1 value2 value3
value4 value5 value6
value7 value8 value9

我需要在Python3中找到一种方法来创建一个字典,其中键是头名(name1,name2,name3),值是下面所有值的总和。 name1:(value1 + value4 + value7)。

到目前为止,我已经提出了:

def sumColumns(columnfile):  
    import csv  
    with open(columnfile) as csvfile:  
        rdr = csv.reader(csvfile)  
        output = {}  
        head = next(rdr)  
        total = 0  
        for column in head:  
            for row in rdr:  
                total += int(row[head.index(column)])  
            output[column] = total  
            total = 0  
        return output

我最终返回了一个带有正确标题的字典,但是我无法确定的总和出现了问题。一列得到总和,其余为0。

1 个答案:

答案 0 :(得分:1)

绝对不是我最漂亮的代码。但在这里。基本上,只需将所有信息存储在列表列表中,然后从那里迭代它。

def sumColumns1(columnfile):
    import csv
    with open(columnfile) as csvfile:
        r = csv.reader(csvfile)
        names = next(r)
        Int = lambda x: 0 if x=='' else int(x)
        sums  = reduce(lambda x,y: [ Int(a)+Int(b) for a,b in zip(x,y) ], r)
        return dict(zip(names,sums))

在有人抱怨之前,以扩展形式(或没有reduce的形式):

def sumColumns1(columnfile):
    import csv
    with open(columnfile) as csvfile:
        r = csv.reader(csvfile)
        names = next(r)
        sums = [ 0 for _ in names ]
        for line in r:
            for i in range(len(sums)):
                sums[i] += int(0 if line[i]=='' else line[i])
        return dict(zip(names,sums))

给我正确的输出。希望有人提出更多pythonic的东西。