Remove an item from a dictionary when its key is unknown

前端 未结 10 1228
悲哀的现实
悲哀的现实 2020-11-29 19:12

What is the best way to remove an item from a dictionary by value, i.e. when the item\'s key is unknown? Here\'s a simple approach:

for key, item in some_di         


        
相关标签:
10条回答
  • 2020-11-29 19:40

    A simple comparison between del and pop():

    import timeit
    code = """
    results = {'A': 1, 'B': 2, 'C': 3}
    del results['A']
    del results['B']
    """
    print timeit.timeit(code, number=100000)
    code = """
    results = {'A': 1, 'B': 2, 'C': 3}
    results.pop('A')
    results.pop('B')
    """
    print timeit.timeit(code, number=100000)
    

    result:

    0.0329667857143
    0.0451040902256
    

    So, del is faster than pop().

    0 讨论(0)
  • 2020-11-29 19:41

    Be aware that you're currently testing for object identity (is only returns True if both operands are represented by the same object in memory - this is not always the case with two object that compare equal with ==). If you are doing this on purpose, then you could rewrite your code as

    some_dict = {key: value for key, value in some_dict.items() 
                 if value is not value_to_remove}
    

    But this may not do what you want:

    >>> some_dict = {1: "Hello", 2: "Goodbye", 3: "You say yes", 4: "I say no"}
    >>> value_to_remove = "You say yes"
    >>> some_dict = {key: value for key, value in some_dict.items() if value is not value_to_remove}
    >>> some_dict
    {1: 'Hello', 2: 'Goodbye', 3: 'You say yes', 4: 'I say no'}
    >>> some_dict = {key: value for key, value in some_dict.items() if value != value_to_remove}
    >>> some_dict
    {1: 'Hello', 2: 'Goodbye', 4: 'I say no'}
    

    So you probably want != instead of is not.

    0 讨论(0)
  • 2020-11-29 19:43

    There is nothing wrong with deleting items from the dictionary while iterating, as you've proposed. Be careful about multiple threads using the same dictionary at the same time, which may result in a KeyError or other problems.

    Of course, see the docs at http://docs.python.org/library/stdtypes.html#typesmapping

    0 讨论(0)
  • 2020-11-29 19:48

    The dict.pop(key[, default]) method allows you to remove items when you know the key. It returns the value at the key if it removes the item otherwise it returns what is passed as default. See the docs.'

    Example:

    >>> dic = {'a':1, 'b':2}
    >>> dic
    {'a': 1, 'b': 2}
    >>> dic.pop('c', 0)
    0
    >>> dic.pop('a', 0)
    1
    >>> dic
    {'b': 2}
    
    0 讨论(0)
  • 2020-11-29 19:50

    This is how I would do it.

    for key in some_dict.keys():
        if some_dict[key] == item_to_remove:
            some_dict.pop(key)
            break
    
    0 讨论(0)
  • 2020-11-29 19:52

    c is the new dictionary, and a is your original dictionary, {'z','w'} are the keys you want to remove from a

    c = {key:a[key] for key in a.keys() - {'z', 'w'}}
    

    Also check: https://www.safaribooksonline.com/library/view/python-cookbook-3rd/9781449357337/ch01.html

    0 讨论(0)
提交回复
热议问题