繁体   English   中英

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

[英]How can you remove superset lists from a list of lists in Python?

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

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

我想删除所有内部列表,这些列表是另一个内部列表的超集(包含另一个列表的所有元素但包含其他元素的列表)。 对于上面的示例,删除超集应导致以下结果:

[[2,3],[5]]

我怎么能做到这一点?

如果集合较小,则集合只能是另一集合的子集,因此通过按大小的升序迭代集合,我们可以针对先前找到的最小子集检查每个元素以知道它是否是最小子集。

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}]

您可以使用列表理解:

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)]

输出:

[[2, 3], [5]]

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

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)

这里是:

super=[[1,2,3],[2,3],[2,4,3],[4,5],[5]]
subset=[s for s in super if not any(set(s).issuperset(set(i)) and len(s)>len(i) for i in super)]

输出:

>>> subset
[[2, 3], [5]]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM