Filter dict to contain only certain keys?

后端 未结 15 933
耶瑟儿~
耶瑟儿~ 2020-11-22 10:52

I\'ve got a dict that has a whole bunch of entries. I\'m only interested in a select few of them. Is there an easy way to prune all the other ones out?

相关标签:
15条回答
  • 2020-11-22 11:45

    Based on the accepted answer by delnan.

    What if one of your wanted keys aren't in the old_dict? The delnan solution will throw a KeyError exception that you can catch. If that's not what you need maybe you want to:

    1. only include keys that excists both in the old_dict and your set of wanted_keys.

      old_dict = {'name':"Foobar", 'baz':42}
      wanted_keys = ['name', 'age']
      new_dict = {k: old_dict[k] for k in set(wanted_keys) & set(old_dict.keys())}
      
      >>> new_dict
      {'name': 'Foobar'}
      
    2. have a default value for keys that's not set in old_dict.

      default = None
      new_dict = {k: old_dict[k] if k in old_dict else default for k in wanted_keys}
      
      >>> new_dict
      {'age': None, 'name': 'Foobar'}
      
    0 讨论(0)
  • 2020-11-22 11:48

    Constructing a new dict:

    dict_you_want = { your_key: old_dict[your_key] for your_key in your_keys }
    

    Uses dictionary comprehension.

    If you use a version which lacks them (ie Python 2.6 and earlier), make it dict((your_key, old_dict[your_key]) for ...). It's the same, though uglier.

    Note that this, unlike jnnnnn's version, has stable performance (depends only on number of your_keys) for old_dicts of any size. Both in terms of speed and memory. Since this is a generator expression, it processes one item at a time, and it doesn't looks through all items of old_dict.

    Removing everything in-place:

    unwanted = set(keys) - set(your_dict)
    for unwanted_key in unwanted: del your_dict[unwanted_key]
    
    0 讨论(0)
  • 2020-11-22 11:50

    If we want to make a new dictionary with selected keys removed, we can make use of dictionary comprehension
    For example:

    d = {
    'a' : 1,
    'b' : 2,
    'c' : 3
    }
    x = {key:d[key] for key in d.keys() - {'c', 'e'}} # Python 3
    y = {key:d[key] for key in set(d.keys()) - {'c', 'e'}} # Python 2.*
    # x is {'a': 1, 'b': 2}
    # y is {'a': 1, 'b': 2}
    
    0 讨论(0)
提交回复
热议问题