[英]fastest way to check if atleast one element in set/list is in each element in a collection of lists/sets
我有以下内容:
list1 = {"a", "b", "c"}
list2 = [
{"a", "s", "d", "f"},
{"q", "w", "e", "c"},
{"v", "b", "n", "m"},
]
我现在想检查 list1 中的元素是否在 list2 中的某个位置。 list2 中的每个元素必须包含 list1 中的一个元素。
我目前所做的是以下内容(前一段时间也在 stackoverflow 上找到了它):
all(list1 & l for l in list2)
这实际上相当快。 但是我现在遇到了一个问题,我有数十亿个不同的 list1,所以我必须想出一个更快的解决方案。 我也尝试过 numba,但我在嵌套列表中苦苦挣扎,并且不支持集合。
我有一堆可以代表该集合的项目(如 list2 中的集合)。 例如,list2 中的第一个集合由“a”、“s”、“d”和“f”组成。 所有这些字符都“描述”了 list2 中的第一组。
我现在要做的是找到描述 list2 的最短组合。 例如:
list2 = [
{"a", "s", "d", "f"},
{"q", "w", "e", "c"},
{"v", "b", "n", "m"},
{"v", "l", "p", "o"},
]
这里描述 list2 的最短组合是 a、q、v(a 描述第一个元素,q 描述第二个元素,v 描述元素 3 和 4)
我构造 list1 的方式是
U = set.union(*list2)
for list1 in itertools.combinations(U,3): #i loop over the combinations to find the minimum one, so combinations(U,2), combinations(U,3) ....
...
这非常有效,即使对于非常大的数字(数以百万计的组合)也是如此,但它仍然有些有限。 我想尽可能地减少它。 编辑:list2 的数据结构如上所述,是一组包含字符串的集合(在我的例子中是 3 个字符的组合),因此 list1 也是一组字符串。
谢谢
您可以进行一个简单的优化,
not any(map(list1.isdisjoint, list2))
isdisjoint
避免了计算完整结果的需要,并且map
在您仅调用单个方法时比理解更快。
但是,如果您想要更优的结果,则必须提供有关您尝试执行的操作的更多详细信息。 特别是,所有数据结构的大小是多少,它们包含哪些元素?
我现在要做的是找到描述 list2 的最短组合
这是Hitting Set Problem ,它得到了很好的研究,并且存在多个求解器,例如这个。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.