我正在尝试迭代字典,以便删除密钥为数字的所有项目。
dict= {'hello':'3', 'baby':'5', '33':'6'}
for k in dict.keys():
if k.isdigit():
del dict[k]
我需要的结果是:
dict={'hello':'3', 'baby':'5'}
我使用上面的代码,但它不起作用? 有人能帮助我吗?
答案 0 :(得分:3)
您可以创建新词典,而不是在循环浏览字典时删除项目:
dict_ = {'hello':'3', 'baby':'5', '33':'6'}
{k: v for k, v in dict_.items() if not k.isdigit()}
# {'baby': '5', 'hello': '3'}
答案 1 :(得分:1)
如上所述,错误RuntimeError: dictionary changed size during iteration
被引发,因为在迭代期间修改了字典。一种解决方案可能是首先注册所有密钥,然后修改字典:
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]
另一个更加pythonic,是建立词典,例如在this answer中使用内涵符号中的词典。
顺便说一句,dict
对于dict
类型的对象来说是一个非常糟糕的名称。
答案 2 :(得分:0)
问题是因为您在遍历时更新字典。而是首先将密钥存储在列表中,然后从字典中删除。
试试这个:
dic= {'hello':'3', 'baby':'5', '33':'6'}
x=dic.keys()
for k in x:
if k.isdigit():
del dic[k]
print dic
输出:
{'baby': '5', 'hello': '3'}
答案 3 :(得分:0)
以下是使用pop
和map
修改原始初始字典的另一种解决方案:
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
输出:
>> my_dict
>> {'a': 1, 'b': 2, 'c': 3}