在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]
当前回答
一行程序:
my_dict = {k: v for k, v in my_dict.copy().items() if not k == value}
my_dict.copy()对象仅用于迭代,在字典理解范围之外不可用。这避免了编辑当前迭代的对象,正如@user395760在回答中所建议的那样。
为了清晰起见,你可以把它分割成多行:
my_dict = {
k: v
for k, v in my_dict.copy().items()
if not k == value
}
其他回答
您可以首先构建一个要删除的键的列表,然后遍历该列表删除它们。
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]
相反,迭代一个副本,例如items()返回的副本:
for k, v in list(mydict.items()):
如果想要删除的项总是在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中是这样。
你可以使用字典理解法。
D = {k: D [k] for k in D if D [k] != val}
使用列表(mydict)是最干净的:
>>> mydict = {'one': 1, 'two': 2, 'three': 3, 'four': 4}
>>> for k in list(mydict):
... if k == 'three':
... del mydict[k]
...
>>> mydict
{'four': 4, 'two': 2, 'one': 1}
这对应于列表的并行结构:
>>> mylist = ['one', 'two', 'three', 'four']
>>> for k in list(mylist): # or mylist[:]
... if k == 'three':
... mylist.remove(k)
...
>>> mylist
['one', 'two', 'four']
它们都可以在python2和python3中工作。