有什么简单的东西像一套不可清洗的物品?

时间:2015-02-04 15:34:19

标签: python python-3.x set

对于dict中的hashable对象,我可以使用set轻松地将重复值存储在dict中。例如:

a = {'test': 1, 'key': 1, 'other': 2}
b = set(a.values())
print(b)

Would display [1,2]

我遇到的问题是我使用dict存储__dict__中变量键之间的映射以及相应的处理函数,这些函数将传递给引擎以订购和处理这些函数,其中一些函数可能很快由于访问API,有些可能会变慢。问题是每个函数可能使用多个变量,因此需要在dict中进行多次映射。我想知道是否有办法做到这一点,或者我是不是在编写自己的解决方案?


结束构建一个可调用的类,因为缓存可以加快我的速度:

from collections.abc import Callable


class RemoveDuplicates(Callable):
    input_cache = []
    output_cache = []

    def __call__(self, in_list):
        if list in self.input_cache:
            idx = self.input_cache.index(in_list)
            return self.output_cache[idx]
        else:
            self.input_cache.append(in_list)
            out_list = self._remove_duplicates(in_list)
            self.output_cache.append(out_list)
            return out_list

    def _remove_duplicates(self, src_list):
        result = []
        for item in src_list:
            if item not in result:
                result.append(item)
        return result

3 个答案:

答案 0 :(得分:1)

如果可以订购对象,则可以使用itertools.groupby来消除重复项:

>>> a = {'test': 1, 'key': 1, 'other': 2}
>>> b = [k for k, it in itertools.groupby(sorted(a.values()))]
>>> print(b)
[1, 2]

答案 1 :(得分:0)

  

是否有类似于不可清除对象的集合的简单

不在标准库中,但您需要超越并搜索BTree的字典实现。我用谷歌搜索,发现很少有点击,第一个(BTree)似乎很有希望和有趣

从维基引用

  

基于BTree的数据结构与Python的几种不同   基本方式。其中最重要的是而dicts   要求密钥支持哈希码和相等比较,   基于BTree的结构不使用哈希码并且需要总计   按键排序。

偏离它的一个微不足道的事实,即一个集合可以被实现为一个未使用该值的字典。

答案 2 :(得分:0)

您可以(间接)使用bisect模块来创建值的有序集合,这将大大加快新值的插入和一般的值成员资格测试 - 这些可以共同用于确保仅限于此将独特的价值投入其中。

在下面的代码中,为了说明,我使用了不可删除的set值。

# see http://code.activestate.com/recipes/577197-sortedcollection
from sortedcollection import SortedCollection

a = {'test': {1}, 'key': {1}, 'other': {2}}

sc = SortedCollection()
for value in a.values():
    if value not in sc:
        sc.insert(value)

print(list(sc))  # --> [{1}, {2}]
相关问题