python中是否有实现RangeDict的库?

2024-10-03 15:25:50 发布

您现在位置:Python中文网/ 问答频道 /正文

guava中有一个RangeMap实现,可用于将范围映射到对象。在

python中有类似的库吗?我在谷歌上还没有找到。在

为了更清楚地说明问题,RangeDict我指的是集合支持用法,例如:

rd = RangeDict()
rd[[1,2]] = 'A'
rd[[11,22]] = 'B'
print rd[1] # A
print rd[12] # B
print 23 in rd # False
print 18 in rd # True

EIDT:

由于似乎没有这样的模块,我编写了一个here,您可以通过pip install rangedict安装它,并按如下方式使用它:

^{pr2}$

Tags: 模块installpip对象infalsetrue用法
2条回答

简单快捷:

class RangeDict():
    def __init__(self):
        self._dict = {}

    def __getitem__(self, key):
        for k, v in self._dict.items():
            if k[0] <= key < k[1]:
                return v
        raise KeyError("Key not found!")

    def __setitem__(self, key, value):
        if len(key) == 2:
            if key[0] < key[1]:
                self._dict.__setitem__((key[0], key[1]), value)

    def __contains__(self, key):
        try:
            return bool(self.__getitem__(key))
        except KeyError:
            return False

rd = RangeDict()
rd[[1, 2]] = 'A'
rd[[11, 22]] = 'B'
print(rd[1])  # A
print(rd[18])  # B
print(23 in rd)  # False
print(18 in rd)  # True

我很快就想出了这个来满足你的四个主张。在

import collections

class RangeDict(collections.MutableMapping):

    def __init__(self, *args, **kwargs):
        self.store = dict()
        self.update(dict(*args, **kwargs))

    def __getitem__(self, key):
        return self.store[self.transform_key(key)]

    def __setitem__(self, key, value):
        self.store[key] = value

    # two possible behaviours
    def __delitem__(self, key):
        del self.store[self.transform_key(key)]
        # del self.store[key]

    def __iter__(self):
        return iter(self.store)

    def __len__(self):
        return len(self.store)

    def transform_key(self, key):
        for k in self.iterkeys():
            if k[0] <= key <= k[1]:
                return k
        return key # this behaviour would need to be better defined

但是,您需要使用元组作为键(不可变),而不是列表(可变)。在

^{pr2}$

相关问题 更多 >