我使用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'
答案 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}