在Python中,我可以在遍历字典时删除字典中的项吗?
我想从字典中删除不符合特定条件的元素,而不是创建一个全新的字典。以下是一个好的解决方案,还是有更好的方法?
for k, v in mydict.items():
if k == val:
del mydict[k]
在Python中,我可以在遍历字典时删除字典中的项吗?
我想从字典中删除不符合特定条件的元素,而不是创建一个全新的字典。以下是一个好的解决方案,还是有更好的方法?
for k, v in mydict.items():
if k == val:
del mydict[k]
当前回答
相反,迭代一个副本,例如items()返回的副本:
for k, v in list(mydict.items()):
其他回答
您可以首先构建一个要删除的键的列表,然后遍历该列表删除它们。
dict = {'one' : 1, 'two' : 2, 'three' : 3, 'four' : 4}
delete = []
for k,v in dict.items():
if v%2 == 1:
delete.append(k)
for i in delete:
del dict[i]
你也可以分两步来做:
remove = [k for k in mydict if k == val]
for k in remove: del mydict[k]
我最喜欢的方法通常是创建一个新词典:
# Python 2.7 and 3.x
mydict = { k:v for k,v in mydict.items() if k!=val }
# before Python 2.7
mydict = dict((k,v) for k,v in mydict.iteritems() if k!=val)
如果想要删除的项总是在dict迭代的“开始”,有一种方法可能是合适的
while mydict:
key, value = next(iter(mydict.items()))
if should_delete(key, value):
del mydict[key]
else:
break
“开头”只保证在某些Python版本/实现中是一致的。例如,来自Python 3.7新提示
dict对象的插入顺序保存特性已被声明为Python语言规范的正式组成部分。
这种方法避免了许多其他答案所建议的字典副本,至少在Python 3中是这样。
在python3中,迭代dic.keys()将引发字典大小错误。你可以用这种替代方式:
使用python3测试,它工作正常,并且没有引发错误“迭代期间字典更改大小”:
my_dic = { 1:10, 2:20, 3:30 }
# Is important here to cast because ".keys()" method returns a dict_keys object.
key_list = list( my_dic.keys() )
# Iterate on the list:
for k in key_list:
print(key_list)
print(my_dic)
del( my_dic[k] )
print( my_dic )
# {}
我在Python3中尝试了上述解决方案,但在字典中存储对象时,这一个似乎是唯一适合我的解决方案。基本上,您可以创建dict()的副本,并在删除原始字典中的条目的同时遍历该副本。
tmpDict = realDict.copy()
for key, value in tmpDict.items():
if value:
del(realDict[key])