翻译字典:时间和空间

时间:2014-05-01 06:40:01

标签: python dictionary reverse

假设我有以下代码,我有一些问题。

>>> asd = {}
>>> asd[1] ='a'
>>> asd[2] = 'b'
>>> asd[3] = 'c'
>>> asd
{1: 'a', 2: 'b', 3: 'c'}

>>> dict((v,k) for k, v in asd.iteritems())
{'a': 1, 'c': 3, 'b': 2}

>>> if 'a' in asd:
    print("1")


>>> if 'a' in dict((v,k) for k, v in asd.iteritems()):
    print("1")
1

当我反转字典时,假设我的字典包含10gb +数据需要多长时间。

如果我不将反向字典存储到另一个字典中,那么将它本身作为一个实例反转它会占用内存空间吗?

我需要反向字典,因为对于某些操作,我希望对值进行O(1)查找。其他一些需要密钥查找。

2 个答案:

答案 0 :(得分:0)

  

当我翻译一本字典时,我需要花多少时间   字典包含10gb +的数据。

唯一有效的答案是"运行它并检查它"。这取决于您的计算机架构。从理论的角度来看,如果dict是基于散列的,你需要一个线性时间,如果它是基于树的,你需要一个O(nlogn)。

  

如果我不将反向字典存储到另一个字典中,那么将它本身作为一个实例反转它会占用内存空间吗?

你需要临时使用两个dicts的内存,其中一个将在进程后被丢弃(如果你使用提供的代码)。然而,通过执行迭代过程可以使其没有额外的记忆("从dict中获取第一个元素&#34 ;;"删除它&#34 ;;"添加到新的" )

答案 1 :(得分:0)

每当你在Python中构造一个新的容器对象时,使用它的理解符号会比其他任何方法都快一些。在这种情况下,如果要构建反向查找字典,可以使用字典理解,如此

d = {i: i * 2 for i in range(10000)}
from timeit import timeit
print timeit("{d[k]: k for k in d}", "from __main__ import d", number = 10000)
# 7.22010397911
print timeit("dict((v, k) for k, v in d.iteritems())", "from __main__ import d", number = 10000)
# 10.6085851192

对于值查找,我建议使用dict.viewvalues这样的

d = {i: i * 2 for i in range(10000)}
print 10 in d.viewvalues()
# True

但是如果字典不会随着时间而改变,那么将值转换为集合将是更好的选择。

values_set = set(d.viewvalues())
相关问题