当它是一个数字时,Python从字典中删除一个键

Python remove a key from dictionary when It's a number

本问题已经有最佳答案,请猛点这里访问。

我正试图遍历字典,以便删除键为数字的所有项。

1
2
3
4
5
dict= {'hello':'3', 'baby':'5', '33':'6'}

for k in dict.keys():
    if k.isdigit():
       del dict[k]

我需要的结果是:

1
dict={'hello':'3', 'baby':'5'}

我使用上面的代码,但它不起作用?有人能帮我吗?


您可以创建一个新字典,而不是在遍历字典时删除项目:

1
2
3
4
dict_ = {'hello':'3', 'baby':'5', '33':'6'}

{k: v for k, v in dict_.items() if not k.isdigit()}
# {'baby': '5', 'hello': '3'}


正如前面所说的那样,由于在迭代过程中修改了措辞,所以会产生错误RuntimeError: dictionary changed size during iteration。一种解决方案是首先注册所有键,然后修改字典名:

1
2
3
4
5
dict= {'hello':'3', 'baby':'5', '33':'6'}

for k in tuple(dict.keys()):  # iterate on a tuple of values that happened to be in dict's keys
    if k.isdigit():
       del dict[k]

另一个更像是Python式的,是在适当的地方建立措辞,例如在这个答案中使用强度符号的措辞。

顺便说一句,对于类型为dict的对象,dict是一个非常坏的名称。


下面是另一个使用popmap修改初始词典的解决方案:

1
2
3
my_dict = {'a':1, 'b':2, 'c':3, '11':4, '12':5}
_ = map(lambda k: my_dict.pop(k), [k for k in my_dict if k.isdigit()])
# The map functions modifies in place your dictionary

输出:

1
2
>> my_dict
>> {'a': 1, 'b': 2, 'c': 3}

问题是因为您在遍历时正在更新字典。而是先将键存储在列表中,然后从字典中删除。

试试这个:

1
2
3
4
5
6
7
dic= {'hello':'3', 'baby':'5', '33':'6'}

x=dic.keys()
for k in x:
    if k.isdigit():
       del dic[k]
print dic

输出:

1
{'baby': '5', 'hello': '3'}