我有dict,比如这个
data={k:k for k in range(20)}
我对 data 的值进行了一些操作,其中一些为 0,例如这个
for k,v in data.items():
data[k] %= 2
在执行此操作时,我想删除所有值为 0 的键,但在运行中会出现错误,因此我必须在最后执行此操作,因为我这样做了
def clean(data):
while True:
try:
for k,v in data.items():
if not v:
del data[k]
return
except RuntimeError:
pass
所以我的问题是:有一种更好的方法可以做到这一点,所以我可以就地进行移动,避免使用额外的内存,更好的是在一次旅行中?
编辑
这与我的预期用途相似
class MapDict(dict):
def __repr__(self):
return '{}({})'.format(self.__class__.__qualname__, super().__repr__())
def map(self,func,*argv):
'''applicate func to every value in this MapDict'''
for k,v in self.items():
self[k] = func(v,*argv)
self.clean()
def clean(self):
while True:
try:
for k,v in self.items():
if not v:
del self[k]
return
except RuntimeError:
pass
>>> data=MapDict( (k,k) for k in range(20) )
>>> data
MapDict({0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19})
>>> from operator import add, mod
>>> data.map(mod,2)
>>> data
MapDict({1: 1, 3: 1, 5: 1, 7: 1, 9: 1, 11: 1, 13: 1, 15: 1, 17: 1, 19: 1})
>>> data.map(add,10)
>>> data
MapDict({1: 11, 3: 11, 5: 11, 7: 11, 9: 11, 11: 11, 13: 11, 15: 11, 17: 11, 19: 11})
>>>
所以这就是为什么我不能创建一个新的 dict,我只想在我的实例中保留相关的值,稍后我需要其他的东西。
那么有没有更好的方法来做到这一点?同时保持内存效率?并且行程最少?
请您参考如下方法:
不允许在迭代字典时从字典中删除项目,但您可以迭代键(或项目)的副本:
for k in list(data):
v = data[k]
if not v:
del data[k]
