【问题标题】:delete all keys except one in dictionary删除字典中除一个以外的所有键
【发布时间】:2012-09-05 10:30:40
【问题描述】:

我有一本字典

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

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

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

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

【问题讨论】:

    标签: python dictionary unset


    【解决方案1】:

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

    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 在 cmets 中指出我的解决方案保持原始对象不变。

    【讨论】:

    • 因为他想修改字典,所以他在此处访问为 lang,在其他地方访问为 something.attributeName。也许吧。
    • @jimifiki something.attributeName?
    • 假设他写 lang = someObject.attributeDict; lang = {'en':lang['en']}。 someObject.attributeDict 会受到这两行的影响吗?
    • @jimifiki nope,OP 没有说他想做那样的事情。
    • @Marko 是的,它是内置的,您可以在 CLI 和 Python 文件中使用它:docs.python.org/library/timeit.html
    【解决方案2】:

    这是相当快的:

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

    【讨论】:

      【解决方案3】:

      改为迭代keys()

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

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

      【讨论】:

        【解决方案4】:

        pop() 像这样通过for 循环

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

        【讨论】:

        • 多次调用pop 会很慢。
        猜你喜欢
        • 1970-01-01
        • 2019-08-11
        • 2017-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多