python defaultdict的自定义键函数

5jvtdoz2  于 2022-12-17  发布在  Python
关注(0)|答案(1)|浏览(159)

定义类似于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 paths:
    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__),因为同样支持“按起点集总”也是明智的。

gkl3eglg

gkl3eglg1#

可能是这样的:

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

注意,如果key函数不能执行,福尔斯到传入的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 ...>]})

相关问题