编程语言
首页 > 编程语言> > python-从字典中弹出键,值对的整洁方法?

python-从字典中弹出键,值对的整洁方法?

作者:互联网

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的输出存储在一个变量中,但是我对此并不完全满意).所以我的问题是:是否有一种优雅的方法来做到这一点?我在这里错过明显的把戏吗?

解决方法:

您可以使用python ABCs定义自己的字典对象,该对象提供了用于定义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,后者已返回键/值对.

标签:python-3-5,python,python-3-x,dictionary
来源: https://codeday.me/bug/20191010/1888123.html