raf*_*ffa 1 python iteration dictionary
我有一个字典,我想迭代并更改其值,但我认为长度的变化可能会导致错误,有没有什么好方法可以做到这一点?
例:
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...)
Run Code Online (Sandbox Code Playgroud)
例如:
for key, value in d.items():
    if rating[value]<4:
        del d[key]
Run Code Online (Sandbox Code Playgroud)
要么
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)
Run Code Online (Sandbox Code Playgroud)
可能不是最好的例子......意味着字典的长度在循环中发生变化.
迭代词典时不要添加或删除键.另外,不要内置阴影dict.
您可以在所有条件下使用字典理解:
d = {k: v for k, v in d.items() if \
     not (conditions and \
     ((k == 'a') or ((k, v) == ('e', 'apple'))))}
Run Code Online (Sandbox Code Playgroud)
我相信你conditions是一个函数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)}
Run Code Online (Sandbox Code Playgroud)