编辑:目标:为嵌套字典做一些事情,用n个嵌套键(即A,B,C,D)来获取单元格A10中的数字。请参阅下面的图片excel描述问题。
我已经完成了以下代码来在嵌套字典中多次匹配键。
我在想:
如何让这个更清洁,
如果在处理时间方面有更好的方法,可以设置这个嵌套字典以获得所需的结果。
请参阅下面我尝试的手头问题代码。
objs = {1: {'A': [-1]},
2: {'B': [2], 'A': [2]},
3: {'B': [15], 'C': [-3], 'A': [18]}
}
c = Counter()
c1 = Counter()
c2 = Counter()
dic = {}
dic1 = {}
dic2 = {}
for k, v in objs.iteritems():
for k1, v1 in v.iteritems():
if k != 3:
c[k1] += 1
val = dic.setdefault(k1, [0])
if val[0] == 0:
dic[k1] = map(add, val, v1)
else:
dic[k1] = map(mul, val, v1)
if k != 1:
c1[k1] += 1
val = dic1.setdefault(k1, [0])
if val[0] == 0:
dic1[k1] = map(add, val, v1)
else:
dic1[k1] = map(mul, val, v1)
if k != 2:
c2[k1] += 1
val = dic2.setdefault(k1, [0])
if val[0] == 0:
dic2[k1] = map(add, val, v1)
else:
dic2[k1] = map(mul, val, v1)
print dic, dic1, dic2
print c, c1, c2
for k, v in c.iteritems():
if v > 1:
a = int(dic[k][0]) * 0.4
print a
for k, v in c1.iteritems():
if v > 1:
b = int(dic1[k][0]) * 0.4
print b
for k, v in c2.iteritems():
if v > 1:
c = int(dic2[k][0]) * 0.2
print c
然后基本上我有一个公式,它将总结所有a
,b
和c
。但在考虑规模时,我可以看到速度是一个问题。所以我想可能使用矩阵(通过numpy),有没有人有任何想法?
答案 0 :(得分:1)
你绝对应该使用的是在字典中使用明确优于O(n)
的密钥查找。
你基本上做的是迭代外部字典中的所有键,然后是内部的所有键,然后你检查外部的键是否是三个中的一个,如果是这样的话,运行一些代码。这是低效的,有两个原因,首先你迭代内部字典,即使外部的键将导致没有执行代码,而且你必须遍历外部字典whych是O(n)
。 / p>
相反,你应该在外部字典中进行键查找,并且只有这三个键才能运行内部循环。类似的东西:
def itersel(d, *keys):
for k in keys:
try:
yield k, d[k]
except KeyError:
pass
for k, v in itersel(objs, 3, 1, 2):
for k1, v1 in v.iteritems():
if k != 3:
...
if k != 1:
...
if k != 2:
...