删除除字典中的一个以外的所有键

NIl*_*rma 20 python dictionary

我有一本字典

lang = {'ar':'arabic', 'ur':'urdu','en':'english'}
Run Code Online (Sandbox Code Playgroud)

我想要做的是删除除一个键以外的所有键.假设我只想在en这里保存.我该怎么做 ?(pythonic解决方案)
我尝试过:

In [18]: for k in lang:
   ....:     if k != 'en':
   ....:         del lang_name[k]
   ....
Run Code Online (Sandbox Code Playgroud)

这给了我运行时错误:RuntimeError: dictionary changed size during iteration

Fab*_*ian 27

你为什么不创建一个新的?

lang = {'en': lang['en']}
Run Code Online (Sandbox Code Playgroud)

编辑:我和jimifiki解决方案之间的基准:

$ python -m timeit "lang = {'ar':'arabic', 'ur':'urdu','en':'english'}; en_value = lang['en']; lang.clear(); lang['en'] = en_value"
1000000 loops, best of 3: 0.369 usec per loop

$ python -m timeit "lang = {'ar':'arabic', 'ur':'urdu','en':'english'}; lang = {'en': lang['en']}"
1000000 loops, best of 3: 0.319 usec per loop
Run Code Online (Sandbox Code Playgroud)

编辑2:jimifiki在评论中指出我的解决方案保持原始对象不变.

  • 因为他想修改字典,所以他访问HERE作为lang,其他地方访问something.attributeName.也许. (2认同)

jim*_*iki 21

这很快:

En_Value = lang['en']
lang.clear() 
lang['en'] = En_Value
Run Code Online (Sandbox Code Playgroud)


the*_*ner 7

keys()相反迭代:

for k in lang.keys():
    if k != 'en':
        del lang_name[k]
Run Code Online (Sandbox Code Playgroud)

如果您使用的是Python 3,我相信您需要使用它list(lang.keys()).


neh*_*iah 6

pop()它通过这样的for循环

[s.pop(k) for k in list(s.keys()) if k != 'en']
Run Code Online (Sandbox Code Playgroud)