Skip to main content
 首页 » 编程设计

python之有没有更好的方法来清理字典

2025年05月04日27Free-Thinker

我有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]