我有这种类型的数据:
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词典。
答案 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
的对象,因为它更容易测试,但它也可以工作。