在嵌套字典中使用或使用矩阵?

时间:2015-12-23 07:11:58

标签: python numpy dictionary matrix linear-algebra

编辑:目标:为嵌套字典做一些事情,用n个嵌套键(即A,B,C,D)来获取单元格A10中的数字。请参阅下面的图片excel描述问题。

objective

我已经完成了以下代码来在嵌套字典中多次匹配键。

我在想:

  1. 如何让这个更清洁,

  2. 如果在处理时间方面有更好的方法,可以设置这个嵌套字典以获得所需的结果。

  3. 请参阅下面我尝试的手头问题代码。

    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
    

    然后基本上我有一个公式,它将总结所有abc。但在考虑规模时,我可以看到速度是一个问题。所以我想可能使用矩阵(通过numpy),有没有人有任何想法?

1 个答案:

答案 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:
          ...