如何删除嵌套列表中另一个子列表中的子列表?

时间:2019-03-12 02:54:53

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

我有一个列表:

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

我想得到:

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

[2,3,4]是重复的,[2,3], [1,5]已完全包含在[2,3,4] [1,5,4]中,所以我想将其删除

我使用set(frozenset(x) for x in a)删除重复项,但是我被如何删除[p2,3],[1,5]困住了,这些[2,3],[1,5]包含在一个子列表中

1 个答案:

答案 0 :(得分:0)

您可以将a中的子列表转换为集合,并按相反的长度对其进行排序,以便您可以遍历它们并将每个集合添加到输出中(如果它不是任何子集的子集)输出中的现有集合:

output = []
for candidate in sorted(map(set, a), key=len, reverse=True):
    if not any(candidate <= incumbent for incumbent in output):
        output.append(candidate)

list(map(list, output))返回:

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

但是,集合是无序的,因此,如果子列表中的原始项目顺序很重要,则您可以利用以下事实:从python 3.7开始就对dict键进行了排序,并将子列表映射到dict键: / p>

output = []
for candidate in sorted(map(dict.fromkeys, a), key=len, reverse=True):
    if not any(candidate.keys() <= incumbent.keys() for incumbent in output):
        output.append(candidate)

使list(map(list, output))返回:

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

如果使用的Python 3.6或更早版本不能保证字典键的顺序,则可以使用collections.OrderedDict来代替字典。