更快地将值添加到现有字典?

时间:2017-10-06 15:44:54

标签: python python-3.x dictionary

我有一本字典词典

#Initialize the dictionary
myDict=dict()
for f in ncp:
    myDict[f]={}
    for t in ncp:
        myDict[f][t] = {}

现在我通过并将值添加到最低级别(恰好是字典键和值为None),就像这样,但我当前的方法非常慢

for s in subsetList:
    stIndex = 0
    for f in list(allNodes.intersection(set(s)))
            for t in list(allNodes.difference(set( allNodes.intersection(s)))):
                myDict[f][t]['st_'+str(stIndex)]=None
    stIndex+=1

我尝试用理解原则来做,但我失败了,因为我找到的理解的例子是创建字典,而不是迭代已经存在的字典来添加。我这样做的尝试甚至不会编译':

myDict[f][t]['st_'+str(stIndex)]
    for f in list(allNodes.intersection(set(s)))
       for t in list(allNodes.difference(set( allNodes.intersection(s)))) = None

3 个答案:

答案 0 :(得分:0)

我会写这样的代码:

myDict = {}
for i, s in enumurate(subsetList):
    tpl = ('st_%d' % (i,), None) # Used to create a new {'st_n': None} later
    x = allNodes.intersection(s)
    for f in x:
        myDict[f] = {}
        for t in allNodes.difference(x):
            myDict[f][t] = dict([tpl])

这减少了您需要创建的新对象的数量,以及按需初始化myDict

答案 1 :(得分:0)

这应该更快......

from itertools import product
from collections import defaultdict

mydict = defaultdict(dict)
for f, t in  product(ncp, repeat=2):
    myDict[f][t] = {}
    for s in subsetList:
        myDict[f][t]['st_'+str(stIndex)] = None

或者每次最里面的关键级别是相同的......

from itertools import product
from collections import defaultdict

innerDict = {}
for s in subsetList: 
    innerDict['st_'+str(stIndex)] = None

mydict = defaultdict(dict)
for f, t in  product(ncp, repeat=2):
    myDict[f][t] = innerDict.copy()

但我不确定创建最里面的字典的副本是否比遍历子列表并每次创建新字典更快。您需要为两个选项计时。

答案 2 :(得分:0)

在这里用经过多次试验的最佳方法理论回答我自己的问题:最终结果是myDict,它是2个元素的函数:allNodes和subsetList,两者都是从SQL开始导入的有效静态表。我的节目。那么,为什么不一次计算myDict并将其存储在SQL中并导入它。因此,不是每次程序运行需要2分钟重建它,它只是几秒钟的pyodbc读取。我知道它是一种警察,但它暂时有效。