Ale*_*ton 7 python dictionary python-3.x python-3.5
pop
是一个很棒的小函数,当在字典上使用时(给定一个已知的键)从字典中删除带有该键的项,并返回相应的值.但是,如果我也想要钥匙怎么办?
显然,在简单的情况下,我可能只是做这样的事情:
pair = (key, some_dict.pop(key))
Run Code Online (Sandbox Code Playgroud)
但是,如果我想要以最低值弹出键值对,遵循上述想法我将不得不这样做......
pair = (min(some_dict, key=some.get), some_dict.pop(min(some_dict, key=some_dict.get)))
Run Code Online (Sandbox Code Playgroud)
...这是可怕的,因为我必须做两次操作(显然我可以将输出存储min
在变量中,但我仍然不完全满意).所以我的问题是:有一种优雅的方式来做到这一点吗?我在这里错过了一个明显的技巧吗?
您可以使用 python ABC定义自己的字典对象,它提供了定义抽象基类的基础结构。然后pop
根据需要重载Python字典对象的属性:
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__)
Run Code Online (Sandbox Code Playgroud)
演示:
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}
Run Code Online (Sandbox Code Playgroud)
注意:正如 @chepner 在评论中建议的那样,作为更好的选择,您可以覆盖popitem
,它已经返回一个键/值对。
归档时间: |
|
查看次数: |
1057 次 |
最近记录: |