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值需要的类型,您可以:
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}