使用Python3上的任何数据结构检查一个组是否是另一个组的子组的最有效方法

使用Python3上的任何数据结构检查一个组是否是另一个组的子组的最有效方法,python,python-3.x,list,dictionary,hashtable,Python,Python 3.x,List,Dictionary,Hashtable,如果我可以在对象列表、整数列表和字典(是否有其他数据结构选项?)之间进行选择,那么哪种数据结构是发现一个组是否是另一个组的子组的最有效的数据结构,以及如何实现 我有一个具有唯一整数属性的类,因此我可以通过它们包含的整数或对象(指针)本身“表示”类对象的属性 一种选择是使用issubset,如下所示: listAtributes2 = [1,2] set(listAtributes).issubset(listAtributes2) 然而,如果使用issubset函数和一个atributes列表

如果我可以在对象列表、整数列表和字典(是否有其他数据结构选项?)之间进行选择,那么哪种数据结构是发现一个组是否是另一个组的子组的最有效的数据结构,以及如何实现

我有一个具有唯一整数属性的类,因此我可以通过它们包含的整数或对象(指针)本身“表示”类对象的属性

一种选择是使用issubset,如下所示:

listAtributes2 = [1,2]
set(listAtributes).issubset(listAtributes2)
然而,如果使用issubset函数和一个atributes列表,我的代码将需要数月到数年才能完成运行,因为这需要执行数十亿次。通常,一个列表包含1到4个元素,而另一个列表包含200到2000个元素


解决这个问题的最佳方法是什么?

看看python集。
set
数据类型具有您需要的所有操作(例如
issubset
),速度非常快。如果您可以简化调用代码并让集合来完成工作,您将看到它的性能良好

>>> x = set(range(1000))
>>> y = {8,37,29,983}
>>> y.issubset(x) 
True
所以我把它放在一个循环中。它在27秒内运行了100000000次

我认为,如果你预先计算你的集合,而不是为每次比较构建它们,你会发现这是一种非常有效的处理方法


使用
set
方法应该相当有效。特别是,如果执行
x.issubset(y)
,则只有
x
的大小才重要,因为
集合使用哈希检查它是否包含给定项

尽管如此,如果您要为每次比较实例化一个集合,那么您的计算会增加很大的开销

一种解决方案是仅在
\uuuuu init\uuuuuuu
方法中实例化一个新的
集合
,并将其填充到
\uuuuuuuuu setattr\uuuuuu
方法中。要同时允许属性删除,您可以定义一个从
集中删除元素的
\uu delattr\uuu
方法。最后,当在
中使用关键字
时,您可以使用
\uuuuuuu contains\uuuuu
方法执行子集比较

class Container:
    def __init__(self, **kwargs):
        self.__dict__['_attr_set'] = set()
        for k, v in kwargs.items():
            setattr(self, k, v)

    def __setattr__(self, key, value):
        self._attr_set.add((key, value))
        super().__setattr__(key, value)

    def __delattr__(self, item):
        for x in self._attr_set:
            if x[0] == item:
                self._attr_set.remove(x)
                break
        super().__delattr__(item)


    def __contains__(self, item):
        return item._attr_set.issubset(self._attr_set)
例子
你想用它干什么?使用
set.issubset
应该相当有效,可能您选择了错误的语言。。。或者错误的抽象。您是否可以将数据预转换为集合类型,以防止每次比较都需要它迭代和创建集合对象?您在这里谈论的是多少原始数据?
set(listAttributes)两个集合中的任何一个在两个或更多的比较中是相同的吗?当然,它们有多少次是相同的?例如,是否只有20-200个元素的50亿个不同集合和1-4个元素的10亿个不同集合,或者在决定数据结构和算法时可能相关的任何其他比率。@gahooa我将代码更改为将数据预转换为集合类型,现在我得到了更好的结果。但是,我注意到set.issubset与数字集、字符串集和对象集(数字集是最快的)在效率上存在一些差异。有没有办法使用set.issubset来比较指针?这样:
a=1
b=a
set(a)。issubset(b)
将返回
True
,而
a=1
b=1
set(a)。issubset(b)
将返回False?
class Container:
    def __init__(self, **kwargs):
        self.__dict__['_attr_set'] = set()
        for k, v in kwargs.items():
            setattr(self, k, v)

    def __setattr__(self, key, value):
        self._attr_set.add((key, value))
        super().__setattr__(key, value)

    def __delattr__(self, item):
        for x in self._attr_set:
            if x[0] == item:
                self._attr_set.remove(x)
                break
        super().__delattr__(item)


    def __contains__(self, item):
        return item._attr_set.issubset(self._attr_set)
x = Container(a=1, b=2, c=3)
y = Container(a=1, b=2)

print(y in x) # True