Skip to main content
 首页 » 编程设计

python之如何遍历 python 中长度发生变化的字典

2025年05月04日22zhoujg

我有一个字典,我想遍历并更改它的值,但我认为长度的变化可能会导致错误,有什么好的方法可以做到这一点吗?

例子:

d = {'a':'orange','b':'pineapple','c':'dragonfruit'} 
rating = {'orange':3, 'pineapple':4, 'dragonfruit':4.5, 'apple':3, 'pear': 3.5} 
 
for key, value in d.items(): 
    if some conditions met: 
        del d['a'] or d['e']='apple' # (or is not operator, i mean literally one of the operation add or delete item...) 

例如:

for key, value in d.items(): 
    if rating[value]<4: 
        del d[key] 

或

d = {'a':['orange'],'b':['pineapple','peach'],'c':['dragonfruit']} 
rating = {'orange':3, 'pineapple':4, 'dragonfruit':4.5, 'apple':3, 'pear': 3.5, 'peach': 5} 
for key, value in d.items(): 
    rating_sum = sum([ rating[v] for v in value]) 
    if rating_sum > 8 and len(value)>1: 
        d['e'] = d[key].pop(-1) 

可能不是最好的例子...意味着字典的长度在循环中发生变化。

请您参考如下方法:

在迭代字典时不要添加或删除键。此外,不要隐藏内置 dict。

您可以在所有条件下使用字典推导式:

d = {k: v for k, v in d.items() if \ 
     not (conditions and \ 
     ((k == 'a') or ((k, v) == ('e', 'apple'))))} 

我假定您的条件 是k 和v 的函数,否则您应该在字典理解之外计算和应用此测试。

但这可能会变得有点困惑,所以将您的逻辑分离到一个函数中并没有什么坏处:

def keep_pair(k, v): 
    if conditions: 
        if (k == 'a') or ((k, v) == ('e', 'apple')): 
            return False 
    return True 
 
d = {k, v for k, v in d.items() if keep_pair(k, v)}