Python,财务/会计和嵌套数据

时间:2012-03-27 10:45:10

标签: python finance hash

我有这种类型的数据:

entity, account, month1, month2, ..., month12
abc, 2000.02, 1,3,...,3
abc, 2000.01,2,3,...,5
xzf, 1000.00, 2,4,...,6

我需要添加所有实体,但首先我需要获得“计算”字段。例如,在实体abc中,帐户“2000”等于“2000.01 + 2000.02”。

此刻我把它全部放在python dict中。结构是:

d = {("abc","2000.01"):[month1,...,month12],("abc","2000.02"):[month1,...,month12],...}

首先想到的是使用eval(是的,我知道eval的问题)并且做:

s = "d[("abc","2000.01")]+d[("abc","2000.02")]"
eval(s)

我需要一个字符串,因为我将阅读配置文件,我将在其中映射和配置所有帐户。所以在conf文件中我会写一些类似“2000 = 2000.01 + 2000.02”的内容。

但是,有两个问题:

1 - 不确定这是最佳的pythonic解决方案

2 - 某些实体没有所有帐户。在上面的例子中,如果实体xvz中缺少“2000.02”,那么eval将抛出一个KeyError,但这是错误的,因为xvz可能有“2000.01”而应该进入“2000”

另外,如果有任何嵌入式数据库可能适合这种操作,我也想看一下。目前我正在考虑使用持久的python词典。

1 个答案:

答案 0 :(得分:1)

如果我理解得很清楚,您希望根据密钥的第一部分(例如'abc')对值进行分组,而不考虑第二部分('2000.01'或{ {1}})。这应该有效:

'2000.02'

使用>>> d = {('abc', '2000.01'): ['month1', 'month12'], ('abc', '2000.02'): ['month1', 'month12']} >>> from collections import defaultdict >>> d2 = defaultdict(list) >>> for (k1, k2), v in d.items(): d2[k1] += v >>> d2 defaultdict(<type 'list'>, {'abc': ['month1', 'month12', 'month1', 'month12']}) >>> d2['abc'] ['month1', 'month12', 'month1', 'month12'] 不允许测试密钥defaultdict中是否已存在密钥k1。这应该适用于你的价值观。我使用字符串而不是d2的对象,因为它更容易测试,但它也可以工作。