在python中汇总字典列表(从CSV)

时间:2016-02-05 04:55:11

标签: python

我使用DictReader将CSV上传到python:

import unicodecsv

with open('lahman-csv_2015-01-24/batting.csv', 'rb') as f:
    reader = unicodecsv.DictReader(f)
    batting = list(reader)

batting[0]

{u'2B': u'0',
 u'3B': u'0',
 u'AB': u'4',
 u'BB': u'0',
 u'CS': u'0',
 u'G': u'1',
 u'GIDP': u'',
 u'H': u'0',
 u'HBP': u'',
 u'HR': u'0',
 u'IBB': u'',
 u'R': u'0',
 u'RBI': u'0',
 u'SB': u'0',
 u'SF': u'',
 u'SH': u'',
 u'SO': u'0',
 u'lgID': u'NA',
 u'playerID': u'abercda01',
 u'stint': u'1',
 u'teamID': u'TRO',
 u'yearID': u'1871'}

我已经编写了这个函数来根据键对某些列进行求和:

def sum_columns(key_list, dictionary_list):
    for key in key_list:
        for i in range(0,len(dictionary_list)):
            sum_one = sum(dictionary_list[i][key])
        print sum_one  

key_list = ['RBI', 'R']
sum_columns(key_list, batting) 

运行时,我收到此错误:

<ipython-input-45-3b0d2b3348b8> in sum_columns(key_list, dictionary_list)
      4     for key in key_list:
      5         for i in range(0,len(dictionary_list)):
----> 6             sum_one = sum(dictionary_list[i][key])
      7         print sum_one
      8 

KeyError: 'RBI'

2 个答案:

答案 0 :(得分:1)

您应该详细说明您的语法,或使用pudb your_script.py更多地了解您的错误。

关键错误是因为dictionary_list[i][key]实际上是dictionary_list[1]['RBI'],因为您的字典大小为1而不是2(即[0,1])所以应该是dictionary_list[0]['RBI']

batting = [{u'2B': u'0', u'BB': u'0', u'HR': u'0',
 u'IBB': u'', u'3B': u'0', u'stint': u'1', u'GIDP': u'',
  u'playerID': u'abercda01', u'HBP': u'', u'teamID': u'TRO',
   u'AB': u'4', u'G': u'1', u'H': u'0', u'yearID': u'1871',
    u'R': u'0', u'RBI': u'0', u'CS': u'0', u'lgID': u'NA',
     u'SH': u'', u'SO': u'0', u'SB': u'0', u'SF': u''}]


def sum_columns(key_list, dictionary_list):
  sum_one = []
  for key in key_list:
      size_dictionary =len(dictionary_list)#1
      for i in range(0,size_dictionary):#for i in [0]
          value = dictionary_list[i][key]
          sum_one.append(sum(map(int,value)))
      print sum_one


key_list = ['RBI', 'R']
sum_columns(key_list, batting) 

'''
[0]
[0, 0]
'''

我对您的问题唯一不理解的是,如果您将key_list更改为['teamID', 'R']会发生什么,因为密钥teamID指的是u'TRO'所以我不明白你为什么或如何想要这个呢?

答案 1 :(得分:1)

你正在传递&#34; RBI&#34;对于列名,但在词典中,键是 u &#34; RBI&#34;。

您可以使用生成器表达式使函数的意图更清晰:

def sum_columns(key_list, dictionary_list):
    for key in key_list:
        column = (dictionary[key] for dictionary in dictionary_list)
        print sum(column)

如果你使用的是python 2.7.11或更新版本,这将返回一个由key索引的求和列的字典:

def sum_columns(keys, dictionaries):
    return {k:sum(d[k] for d in dictionaries) for k in keys}