有没有像不可散列对象的集合这样简单的东西?
Is there something simple like a set for un-hashable objects?
对于字典中的可哈希对象,我可以使用集合轻松配对存储在字典中的重复值。例如:
a = {'test': 1, 'key': 1, 'other': 2}
b = set(a.values())
print(b)
Would display [1,2]
我遇到的问题是我正在使用字典来存储 __dict__
中变量键之间的映射以及将传递给引擎以订购和处理这些函数的相应处理函数,其中一些函数可能快一些可能由于访问 API 而变慢。问题是每个函数可能使用多个变量,因此需要在字典中进行多次映射。我想知道是否有办法做到这一点,或者我是否无法编写自己的解决方案?
最终构建了一个可调用的 class,因为缓存可以为我加快速度:
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
Is there something simple like a set for un-hashable objects
不在标准库中,但您需要查看并搜索字典的 BTree 实现。我在谷歌上搜索了一下,发现很少有第一个 (BTree) 看起来很有前途和有趣的地方
引用自 wiki
The BTree-based data structures differ from Python dicts in several
fundamental ways. One of the most important is that while dicts
require that keys support hash codes and equality comparison, the
BTree-based structures don’t use hash codes and require a total
ordering on keys.
偏离了一个微不足道的事实,即一个集合可以被实现为一个字典,其中的值是未使用的。
如果对象可以排序,可以使用itertools.groupby
去重:
>>> a = {'test': 1, 'key': 1, 'other': 2}
>>> b = [k for k, it in itertools.groupby(sorted(a.values()))]
>>> print(b)
[1, 2]
您可以(间接地)使用 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}]
对于字典中的可哈希对象,我可以使用集合轻松配对存储在字典中的重复值。例如:
a = {'test': 1, 'key': 1, 'other': 2}
b = set(a.values())
print(b)
Would display [1,2]
我遇到的问题是我正在使用字典来存储 __dict__
中变量键之间的映射以及将传递给引擎以订购和处理这些函数的相应处理函数,其中一些函数可能快一些可能由于访问 API 而变慢。问题是每个函数可能使用多个变量,因此需要在字典中进行多次映射。我想知道是否有办法做到这一点,或者我是否无法编写自己的解决方案?
最终构建了一个可调用的 class,因为缓存可以为我加快速度:
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
Is there something simple like a set for un-hashable objects
不在标准库中,但您需要查看并搜索字典的 BTree 实现。我在谷歌上搜索了一下,发现很少有第一个 (BTree) 看起来很有前途和有趣的地方
引用自 wiki
The BTree-based data structures differ from Python dicts in several fundamental ways. One of the most important is that while dicts require that keys support hash codes and equality comparison, the BTree-based structures don’t use hash codes and require a total ordering on keys.
偏离了一个微不足道的事实,即一个集合可以被实现为一个字典,其中的值是未使用的。
如果对象可以排序,可以使用itertools.groupby
去重:
>>> a = {'test': 1, 'key': 1, 'other': 2}
>>> b = [k for k, it in itertools.groupby(sorted(a.values()))]
>>> print(b)
[1, 2]
您可以(间接地)使用 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}]