簡體   English   中英

python defaultdict的自定義鍵功能

[英]Custom key function for python defaultdict

有什么好方法可以定義類似於list.sortkey參數的自定義鍵函數 ,以供在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.sortkey參數,而不必將此鍵定義放到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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM