[英]Custom key function for python defaultdict
有什么好方法可以定義類似於list.sort
的key
參數的自定義鍵函數 ,以供在collections.defaultdict
使用?
這是一個示例用例:
import collections
class Path(object):
def __init__(self, start, end, *other_features):
self._first = start
self._last = end
self._rest = other_features
def startpoint(self):
return self._first
def endpoint(self):
return self._last
# Maybe it has __eq__ and __hash__, maybe not
paths = [... a list of Path objects ...]
by_endpoint = collections.defaultdict(list)
for p in people:
by_last_name[p.endpoint()].append(p)
# do stuff that depends on lumping paths with the same endpoint together
我想要的是一種告訴by_endpoint
使用Path.endpoint
作為key
函數的方法,類似於list.sort
的key
參數,而不必將此鍵定義放到Path
類本身中(通過__eq__
和__hash__
),因為同樣也支持“按起點集總”也是明智的。
可能是這樣的:
from collections import defaultdict
class defaultkeydict(defaultdict):
def __init__(self, default_factory, key=lambda x: x, *args, **kwargs):
defaultdict.__init__(self, default_factory, *args, **kwargs)
self.key_func = key
def __getitem__(self, key):
return defaultdict.__getitem__(self, self.get_key(key))
def __setitem__(self, key, value):
defaultdict.__setitem__(self, self.get_key(key), value)
def get_key(self, key):
try:
return self.key_func(key)
except Exception:
return key
請注意,如果無法執行鍵功能,則邏輯會退回到傳遞的鍵上。 這樣,您仍然可以使用字符串或任何鍵來訪問項目。
現在:
p = Path("Seattle", "Boston")
d = defaultkeydict(list, key=lambda x: x.endpoint())
d[p].append(p)
print(d) # defaultdict(<type 'list'>, {'Boston': [<__main__.Path object at ...>]})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.