【发布时间】:2018-11-01 21:22:13
【问题描述】:
如果我可以在对象列表、整数列表和字典之间进行选择(还有其他数据结构选项吗?),这是发现一个组是否是其他组的子组的最有效的数据结构,以及如何实施?
我有一个具有唯一整数属性的类,因此我可以通过它们包含的整数或对象(指针)本身来“表示”类对象。
a.atributeEx = 1
b.atributeEx = 2
c.atributeEx = 3
listOfPointers = [a,b,c]
listAtributes = [1,2,3]
dictEx = ['1':1, '2':2, '3':3]
一种选择是使用 issubset,如下所示:
listAtributes2 = [1,2]
set(listAtributes).issubset(listAtributes2)
但是,使用带有属性列表的 issubset 函数,我的代码需要数月到数年才能完成运行,因为这必须执行数十亿次。通常,一个列表有 1 到 4 个元素,而另一个列表有 200 到 2000 个元素。
解决这个问题的最佳方法是什么?
【问题讨论】:
-
你想用它做什么?使用
set.issubset应该是相当有效的,也许你选择了错误的语言……或者错误的抽象。 -
您能否将数据预先转换为集合类型,以防止每次比较时都需要迭代和创建集合对象?您在这里谈论多少原始数据?
-
set(listAttributes) <= set(listAttributes2)应该相当高效和快速,肯定比原生 Python 提供的任何其他东西都快。在什么情况下需要几个月到几年的时间? -
在两个或多个比较中,两个集合中的任何一个是否相同?那么,它们多久相同一次?例如。是否只有 50 亿个不同的集合包含 20-200 个元素和 10 亿个包含 1-4 个元素,或者在决定数据结构和算法时可能相关的任何其他比率。
-
@gahooa 我更改了代码以将数据预转换为设置类型,现在我的结果要好得多。但是,我注意到将 set.issubset 与数字、字符串和对象集(数字集是最快的)一起使用之间存在一些效率差异。有没有办法使用 set.issubset 来比较指针?这样:
a = 1、b = a、set(a).issubset(b)将返回True,而a = 1、b = 1、set(a).issubset(b)将返回 False?
标签: python python-3.x list dictionary hashtable