我有一个巨大的图表,包含超过100000个密钥,因此效率是一个巨大的问题。我正在浏览每个键的值,并且对于每个值,我希望它成为另一个字典中的键,其值为剩余值... E.g ...
graph = {'foobar': ['1', '2', '3']}
result = {'1' : ['2', '3'], '2' : ['1', '3'], '3' : ['1', '2']} #in no particular order
这是我目前的代码......
for i in heroDict.values():
for j in i:
if graph.has_key(j):
tempDict = copy.deepcopy(i)
tempDict.remove(j)
heroList = tempDict
graph[j] += heroList
else:
tempDict = copy.deepcopy(i)
tempDict.remove(j)
heroList = tempDict
graph[j] = heroList
return graph
'heroDict'是一个类似于示例的字典,除非非常大。
我遇到的问题是我的代码运行速度非常慢,因为我正在执行deepcopy()。所以对于例如foobar的例子,我得到'1'作为关键。我将['1','2','3']复制到一个临时字典中,因此对它的更改不会影响我返回的最终字典。然后我从['1','2','3']中删除键并为其指定键'1'。所以我留下了{'1':['2','3']}这就是我想要的东西,但它花了太长时间,因为它迭代了100000次。
我的最后一个问题是,我可以以任何方式改进这一点,以便它运行得更快吗?
非常感谢任何帮助。
答案 0 :(得分:4)
排列包含在itertools
。
您的示例中的典型用法是:
>>> from itertools import permutations
>>> values = graph['foobar']
>>> result = {x[0]:x[1:] for x in permutations(values)}
>>> print result
{'1': ('3', '2'), '2': ('3', '1'), '3': ('2', '1')}
使用foobar中的任意数量的值。排列是一个生成器,因此您可以一次调用一个项目,而不是一次生成整个dict。
不确定会有多快。