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

35

我有一个字典

lang = {'ar':'arabic', 'ur':'urdu','en':'english'}

我想要做的是删除除了一个键之外的所有键。 假设我只想在这里保存en。 我该如何做?(使用Python的解决方案)
我的尝试

In [18]: for k in lang:
   ....:     if k != 'en':
   ....:         del lang_name[k]
   ....

我遇到了运行时错误:RuntimeError: dictionary changed size during iteration

4个回答

47

为什么不直接创建一个新的?

lang = {'en': lang['en']}

编辑: 我的解决方案与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

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


3
因为他想修改他在此处访问为"lang"的字典,在其他地方访问为"something.attributeName"的可能性。也许。 - jimifiki
Fabian,你能告诉我一些关于timeit的事情吗?它已经在Python中了吗?我该如何在.py文件中使用它? - Marko
1
@Marko 是的,它是内置的,你可以从CLI和Python文件中使用它:http://docs.python.org/library/timeit.html - Fabian
我想做的是删除除一个键以外的所有键,这意味着他想修改对象。你只是将相同的名称分配给另一个对象。很可能(95%)他需要你的解决方案。但他必须记住原始对象保持不变......你的答案运行得更快(避免了clear()),这并不奇怪。 - jimifiki
@jimifiki 好的,我同意你的观点。让我们看看他会如何回应。已为你的答案点赞。 - Fabian
显示剩余3条评论

33

这很快:

En_Value = lang['en']
lang.clear() 
lang['en'] = En_Value

9

应该使用keys()方法进行迭代:

for k in lang.keys():
    if k != 'en':
        del lang_name[k]

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

6

可以使用以下 for 循环来通过 pop() 方法进行操作:

[s.pop(k) for k in list(s.keys()) if k != 'en']

1
调用 pop 这么多次会很慢。 - Cristian Ciupitu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接