同时将字典的所有值替换为零python

时间:2012-12-04 21:26:59

标签: python dictionary

我有一个非常大的字典,大概是10,000 keys/values,我想同时将所有值更改为0。我知道我可以循环并将所有值设置为0,但这需要永远。无论如何我可以同时所有值设置为0吗?

循环方法,非常慢:

#example dictionary
a = {'a': 1, 'c': 1, 'b': 1, 'e': 1, 'd': 1, 'g': 1, 'f': 1, 'i': 1, 'h': 1, 'k': 1,
 'j': 1, 'm': 1, 'l': 1, 'o': 1, 'n': 1, 'q': 1, 'p': 1, 's': 1, 'r': 1, 'u': 1,
 't': 1, 'w': 1, 'v': 1, 'y': 1, 'x': 1, 'z': 1}
for key.value in a.items():
    a[key] = 0

输出:

{'a': 0, 'c': 0, 'b': 0, 'e': 0, 'd': 0, 'g': 0, 'f': 0, 'i': 0, 'h': 0, 'k': 0,
 'j': 0, 'm': 0, 'l': 0, 'o': 0, 'n': 0, 'q': 0, 'p': 0, 's': 0, 'r': 0, 'u': 0,
 't': 0, 'w': 0, 'v': 0, 'y': 0, 'x': 0, 'z': 0}

5 个答案:

答案 0 :(得分:31)

您想要dict.fromkeys()

a = dict.fromkeys(a, 0)

答案 1 :(得分:5)

感谢@akaRem的评论:)

a = dict.fromkeys( a.iterkeys(), 0 )

答案 2 :(得分:1)

请注意,如果密钥的顺序很重要,那么解决方案可能不合适,因为它似乎重新排序。

要阻止这种情况发生使用列表理解:

aDictionary =  { x:0 for x in aDictionary}

注意:只有2.7.x和2.x独占

答案 3 :(得分:0)

如果你知道你的dict值需要什么类型,你可以这样:

  1. 将dict值存储在array.array对象中。这使用连续的内存块。
  2. dict,而不是存储实际值将存储可以找到实际值的数组索引
  3. 使用连续的二进制字符串零重新初始化数组
  4. 没有测试性能,但应该更快......

    
    import array
    
    class FastResetDict(object):
    
        def __init__(self, value_type):
            self._key_to_index = {}
            self._value_type = value_type
            self._values = array.array(value_type)
    
        def __getitem__(self, key):
            return self._values[self._key_to_index[key]]
    
        def __setitem__(self, key, value):
            self._values.append(value)
            self._key_to_index[key] = len(self._values) - 1
    
        def reset_content_to_zero(self):
            zero_string = '\x00' * self._values.itemsize * len(self._values)
            self._values = array.array(self._value_type, zero_string)
    
    
    
    fast_reset_dict = FastResetDict('i')
    fast_reset_dict['a'] = 103
    fast_reset_dict['b'] = -99
    
    print fast_reset_dict['a'], fast_reset_dict['b']
    fast_reset_dict.reset_content_to_zero()
    print fast_reset_dict['a'], fast_reset_dict['b']
    

答案 4 :(得分:0)

要在@Daniel Roseman上扩展答案,a=a.fromkeys(d,0)在功能上是相同的,并且速度更快。另外,如果您打算频繁进行此操作save=dict.fromkeys(a,0),然后致电a=save.copy(),则在某些情况下(较大的字典)会更快{p>