python - 如何遍历长度在 python 中发生变化的字典?
问题描述
我有一本要遍历并更改其值的字典,但我认为长度的更改可能会导致错误,有什么好的方法可以做到这一点吗?
例子:
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'))))}
我认为你conditions
是 and 的函数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)}
推荐阅读
- java - 如果 Java 8 样式中存在值,如何从 HashMap 中删除
- powershell - 连接“字符串 + 变量 + 字符串”导致“字符串 + System.Data.DataRow + 字符串”
- html - li:nth-child(x):hover 部分工作
- javascript - Extract generic type parameters from a string
- ruby-on-rails - 将 Mail::Part 保存为载波附件
- excel - 如何将excel文件复制到outlook文件夹中
- excel - 当我单击按钮时,是否有可以使文本框中的一行突出显示并显示的功能?
- angular - Angular 7 Service Worker 设置 - ngsw-worker.js 注册错误
- shell - 量角器/茉莉花测试在詹金斯超时
- vba - 如何删除具有特定 Shading.BackgroundPatternColor 的所有行(从选定的表中)