【问题标题】:Efficient way to check if it is a subset of any group in Python检查它是否是 Python 中任何组的子集的有效方法
【发布时间】:2020-03-26 08:32:12
【问题描述】:

在 Python 中迭代 subset_candidates 并检查它是否是任何 groups 集合的子集的有效方法是什么?
下面的示例只有几个项目,但我希望有 10k 个子集候选者和 10k 个组,所以我想知道有效的方法。
也许networkX 是解决方案,但我不知道应该对这种情况应用哪种方法。

subset_candidates = [
  [2, 3], # true (subset of groups[0]) 
  [10, 12], # false
  [100, 110], # true (subset of groups[2])
  [1, 10, 100], # false
]

groups = [
  [1,2,3],
  [10,11,13],
  [100, 105, 110],
]

【问题讨论】:

  • issubset 怎么样?
  • 如果类型只是列表,则如下所示:all(x in group for x in subset)
  • @AlexanderLekontsev 最好根据搜索的复杂性更改类型。
  • @dspencer 这是一个很好的解决方案,我不知道。但它必须每次循环groups。这是唯一的方法吗?

标签: python python-3.x list algorithm set


【解决方案1】:

你可以用set.issubset试试这个

s=map(set,subset_candidates)
g=list(map(set,groups))

for subset in s:
    print(any(subset.issubset(i) for i in g))

输出

True
False
True
False

【讨论】:

  • 无需将s 设为列表-map 对象很好(但是,在g 的情况下,列表是必要的,因为您要多次迭代它)跨度>
  • 这是唯一的方法吗?它必须每次循环组,迭代次数为 10k x 10k。
  • 当然不是...但是要提供优化的解决方案,我们必须知道您如何获得subset_candidates,并且我们必须知道您的数据结构是什么...。如果子集是随机的,那么您必须进行n x n 搜索。但是如果有一个关系,例如 subset_candidates 总是排序并且groups 也排序然后搜索减少到O(logn) 那么我们可以降低复杂性。 @哈里
【解决方案2】:

subset_candidates 中的每个列表和groups 中的每个list 转换为set。然后,对于subset_candidates 中的每个集合,检查是否issubset(a, b)

【讨论】:

    猜你喜欢
    • 2018-11-01
    • 2020-09-16
    • 2012-02-21
    • 1970-01-01
    • 2010-10-25
    • 2015-03-20
    • 1970-01-01
    • 2011-12-19
    • 2011-01-04
    相关资源
    最近更新 更多