从列表中移除子列表

5

我希望找到最快的方法来解决这个问题,假设我有一个列表的列表:

myList = [[1,2,3,4,5],[2,3],[4,5,6,7],[1,2,3],[3,7]]

我希望能够移除所有其他列表的子列表,例如我希望获得以下输出:

myList = [[1,2,3,4,5],[4,5,6,7],[3,7]]

由于列表 [2,3] 和 [1,2,3] 被完全包含在其他列表中,因此它们被删除了,而 [3,7] 没有被删除,因为没有一个单独的列表包含所有这些元素。

如果使用列表或集合更容易处理,而不限于任何一种数据结构。

我能想到最好的方法是这样的,但它并不真正起作用,因为我正在迭代删除列表。我试图将其复制到一个新列表中,但是无论如何都无法使它正常工作。

for outter in range(0,len(myList)):
outterSet = set(myList[outter])
for inner in range(outter,len(myList)):
    innerSet = set(myList[inner])
    if innerSet.issubset(outterSet):
        myList.remove(innerSet)

谢谢。

4
我非常确定你没有一组清单。 - juanpa.arrivillaga
Python不接受列表作为集合的元素,因为列表是不可哈希的。 - Chris Mueller
非常抱歉,我已经编辑了问题以反映实际情况。我有一个列表的列表。 - doddy
1个回答

5
解决您的问题的关键是一组集合列表:
lists = [[1,2,3,4,5],[2,3],[4,5,6,7],[1,2,3],[3,7]]

sets = [set(l) for l in lists]

new_list = [l for l,s in zip(lists, sets) if not any(s < other for other in sets)]

这将内部列表转换为集合,将每个集合与其他集合进行比较,以查看它是否包含在其中(使用<运算符),如果它不被严格包含在另一个集合中,则将原始列表添加到新的列表中。


谢谢。这个完美地解决了我的问题。我不是很理解最后一行发生了什么,所以我把它分成了几步来写,现在我明白了。 - doddy
如果它包含在其中(使用<运算符),我不知道这一点。谢谢! - John Gordon
yinnonsanders,我在使用您的代码时遇到了问题,使用以下列表:..........lists = [[10, 20, 40], [10, 30, 30], [10, 40, 20], [20, 10, 40], [20, 20, 30], [20, 30, 20], [20, 40, 10], [20, 10, 40], [20, 20, 30], [20, 30, 20], [20, 40, 10], [20, 10, 40], [20, 20, 30], [20, 30, 20], [20, 40, 10]]....................sets = [set(l) for l in lists]..........print(sets)..........输出结果与我的预期不符。请给予建议。非常感谢。 - goughgough

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接