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

Python 同时将字典的所有值替换为零,python,dictionary,Python,Dictionary,我有一个非常大的字典,大概是10000个键/值,我想同时将所有值更改为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':

我有一个非常大的字典,大概是
10000个键/值
,我想同时将所有值更改为
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}

您需要
dict.fromkeys()


感谢@akaRem的评论:)


如果您知道dict值需要的类型,您可以:

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

    
    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']
    

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

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

    aDictionary =  { x:0 for x in aDictionary}
    

    注意:只需2.7.x和2.x互斥

    即可展开答案
    a=a。fromkeys(d,0)
    在功能上是相同的,而且速度更快。另外,如果您计划经常执行此操作,然后调用
    a=save.copy()
    ,在某些情况下(大的dict)

    这比循环快吗?我相信它在运行时会占用两倍的内存,因为它会创建一个单独的副本,对吗?令人惊讶的是,循环速度更快,你的方法,
    10000000循环,每个循环3:0.0226 usec的最佳值
    ,循环
    10000000循环,每个循环3:0.0224 usec的最佳值
    @enginefree感谢评测;我认为这两者应该是相似的,因为原始循环和fromkeys都可能使用迭代器。我认为Krativitea存储一个空副本的想法是最有意义的。您分析过您的代码并发现这是一个限制因素吗?一本有10k条目的字典并不是很大,与其说它的大小,不如说它是我在字典中循环使用的次数。我将它编程为几乎每秒钟循环一次,此外,我没有一个而是多个字典。如果所有值都在一个连续内存块中,您可以同时将所有值设置为0。我认为你不能用内置的命令来做这件事。。。除非您在C中创建自己的dict实现数据结构。@loanalexandrucu谢谢您的建议!我想我可以这样做。最好的方法是在开始放入内容之前复制一份空字典。因为不需要所有键的副本,所以最好使用
    iterkeys()
    我还没有对此进行测试,但我希望访问FastResetDict中的值会稍微慢一点,因此这只在边缘情况下是值得的;纯粹是出于错误,但奇怪的是,除非修改答案,否则我似乎无法取消投票。如果有人编辑,我很想删除我的错误投票。@NoahGary我认为OP的意思是“不包括Python2.x”,因此它适用于Python3.x
    
    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']
    
    aDictionary =  { x:0 for x in aDictionary}