对于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
答案 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}]