从字典中弹出键,值PAIR的巧妙方法?

时间:2015-10-27 15:08:34

标签: python python-3.x dictionary python-3.5

pop是一个很棒的小函数,当在字典上使用时(给定一个已知的键)从字典中删除带有该键的项,并返回相应的值。但是,如果我也想要钥匙呢?

显然,在简单的情况下,我可能会做这样的事情:

pair = (key, some_dict.pop(key))

但是,如果我想要弹出具有最低值的键值对,遵循上述想法我将不得不这样做...

pair = (min(some_dict, key=some.get), some_dict.pop(min(some_dict, key=some_dict.get)))

...这是可怕的,因为我必须做两次操作(显然我可以将min的输出存储在一个变量中,但我仍然不完全满意)。所以我的问题是:有一种优雅的方式来做到这一点吗?我在这里错过了一个明显的伎俩吗?

3 个答案:

答案 0 :(得分:3)

堆支持您描述的pop-min操作。但是,您首先需要从字典中创建堆。

import heapq
# Must be two steps; heapify modifies its argument in-place.
# Reversing the key and the value because the value will actually be
# the "key" in the heap. (Or rather, tuples are compared 
# lexicographically, so put the value in the first position.)
heap = [(v, k) for k, v in some_dict.items()]
heapq.heapify(heap)

# Get the smallest item from the heap
value, key = heapq.heappop(heap)

答案 1 :(得分:3)

您可以使用python ABC定义自己的字典对象,它提供了定义abstract base classes的基础结构。然后根据您的需要重载python词典对象的pop属性:

from collections import Mapping

class MyDict(Mapping):
    def __init__(self, *args, **kwargs):
        self.update(dict(*args, **kwargs))

    def __setitem__(self, key, item): 
        self.__dict__[key] = item

    def __getitem__(self, key): 
        return self.__dict__[key]

    def __delitem__(self, key): 
        del self.__dict__[key]

    def pop(self, k, d=None):
        return k,self.__dict__.pop(k, d)

    def update(self, *args, **kwargs):
        return self.__dict__.update(*args, **kwargs)

    def __iter__(self):
        return iter(self.__dict__)

    def __len__(self):
        return len(self.__dict__)

    def __repr__(self): 
        return repr(self.__dict__)

演示:

d=MyDict()

d['a']=1
d['b']=5
d['c']=8

print d
{'a': 1, 'c': 8, 'b': 5}

print d.pop(min(d, key=d.get))
('a', 1)

print d
{'c': 8, 'b': 5}

注意:正如@chepner在评论中建议的更好的选择,您可以覆盖popitem,它已经返回一个键/值对。

答案 2 :(得分:1)

这是一个更简单的实现

class CustomDict(dict):
    def pop_item(self, key):
        popped = {key:self[key]} #save "snapshot" of the value of key before popping
        self.pop(key)
        return popped

a = CustomDict()
b = {"hello":"wassup", "lol":"meh"}
a.update(b)
print(a.pop_item("lol"))
print(a)

所以我们在这里创建一个自定义dict,弹出你想要的项目,并给出键值对