首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Python中的列表中删除超集列表?

如何从Python中的列表中删除超集列表?
EN

Stack Overflow用户
提问于 2018-06-01 01:25:19
回答 4查看 1.2K关注 0票数 5

我在Python中有一个列表,如下所示:

代码语言:javascript
复制
[[1,2,3],[2,3],[2,4,3],[4,5],[5]]

我希望删除另一个内部列表的所有内部列表,这些内部列表是一个超集(包含另一个列表的所有元素,但包含其他元素的列表)。对于上面的例子,删除超集应该会产生以下结果:

代码语言:javascript
复制
[[2,3],[5]]

我怎样才能做到这一点?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-06-01 01:41:35

如果集合较小,则它只能是另一个子集,因此,通过按升序对集合进行迭代,我们可以根据以前找到的最小子集来检查每个元素,以确定它是否是最小子集。

代码语言:javascript
复制
def get_minimal_subsets(sets):
    sets = sorted(map(set, sets), key=len)
    minimal_subsets = []
    for s in sets:
        if not any(minimal_subset.issubset(s) for minimal_subset in minimal_subsets):
            minimal_subsets.append(s)

    return minimal_subsets

l = [[1,2,3],[2,3],[2,4,3],[4,5],[5]]

print(get_minimal_subsets(l))  # [{5}, {2, 3}]
票数 3
EN

Stack Overflow用户

发布于 2018-06-01 01:27:51

您可以使用列表理解:

代码语言:javascript
复制
d = [[1,2,3],[2,3],[2,4,3],[4,5],[5]]
new_d = [i for i in d if not any(all(c in i for c in b) and len(b) < len(i) for b in d)]

输出:

代码语言:javascript
复制
[[2, 3], [5]]
票数 2
EN

Stack Overflow用户

发布于 2018-06-01 01:47:09

最后,我得到了@Olivier Melan on的相同想法。您可以使用升序丢弃子集,并在O(n^2) *O(子集计算)中运行。

代码语言:javascript
复制
input = [[1,2,3],[2,3],[2,4,3],[4,5],[5]]
sets = [set(x) for x in input]
sets.sort(key=len)

subsets = []
while sets != []:
    cur = sets[0]
    subsets.append(cur)
    sets = [x for x in sets[1:] if not cur <= x]

output = [list(x) for x in subsets]
print(output)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50634876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档