1

我有以下数据,第一列是ID,第二列是category,第三列是items,第四列是price。我正在尝试按类别查找每个 ID 的支出总和(左起第 2 列):我在下面包含了一个示例输出。

但是,我坚持elif声明并说它有keyError: 'A'。我真的不知道出了什么问题。

样本输出:

Spending by B
fuel - 19.60 
grocery - 11.42

输入:

A|groceries|cereal|15.50
A|groceries|milk|14.75
A|tobacco|cigarettes|25.00
A|fuel|gasoline|54.90
B|fuel|propane|19.60
B|groceries|apple|11.42
C|tobacco|cigarettes|25.00

代码:

for line in fileinput.input(fo1):
    #print line
    line =str.rstrip(line)
    line = line.split('|')
    print line[0],line[1]
    (name,category,items,price)=line

    if line[0] in report2 and line[1] in report2:
        report2[line[0]][line[1]] += float(price)    
    elif line[1] in report2[line[0]]:
        report2[line[0]][line[1]]+=float(price)
    else:
        report2[line[0]][line[1]]=float(price)

print report2.keys
print report2.items()
4

3 回答 3

0

这里的问题是您尝试访问report2尚未创建的值。

这与使用变量时遇到的问题几乎相同。想象一下你有这样的代码:

i = 1
if i == 1:
    a += 2
else:
    a = 2

你不能这样做a += 2,因为那里没有价值。

因此,要解决此问题,您需要处理第一次看到密钥的情况。您可以使用defaultdict代替dict,或setdefault方法,或显式in检查,或 a try,但通常前两个中的一个会更容易。

于 2013-08-08T20:43:43.457 回答
0

您可以在此处使用collections.defaultdict和的组合collections.Counter

from collections import defaultdict, Counter
dic = defaultdict(lambda: Counter())
with open('abc1') as f:
    for line in f:
        k, item, _, price = line.split('|')
        dic[k][item] += float(price)

for k, v in dic.items():
    print "Spending by",k
    for item, val in v.items():
        print "{} - {}".format(item, val)
    print 

输出:

Spending by A
fuel - 54.9
groceries - 30.25
tobacco - 25.0

Spending by C
tobacco - 25.0

Spending by B
fuel - 19.6
groceries - 11.42
于 2013-08-08T20:44:43.313 回答
0

Numpy怎么样:

import numpy

# data prep
examplerows= ['A|groceries|cereal|15.50', 'A|groceries|milk|14.75', 'A|tobacco|cigarettes|25.00', 'A|fuel|gasoline|54.90', 
            'B|fuel|propane|19.60', 'B|groceries|apple|11.42', 'C|tobacco|cigarettes|25.00']

examplerows = [r.split('|') for r in examplerows]

# summarize using numpy
data = numpy.array(examplerows)
categories = numpy.unique(data[:, 0])
groups = [data[data[:, 0] == c, 3] for c in categories]
value_groups = [numpy.array([float(i) for i in g]).sum() for g in groups]

print dict(zip(categories, value_groups))
于 2013-08-08T21:40:08.847 回答