【问题标题】:Removing sublists from a list of lists从列表列表中删除子列表
【发布时间】:2018-04-22 21:58:36
【问题描述】:

我正在尝试找到解决此问题的最快方法,比如我有一个列表列表:

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)

谢谢。

【问题讨论】:

  • 我很确定你没有一组列表。
  • Python 不接受列表作为集合的元素,因为列表不可散列。
  • 抱歉,我已编辑问题以反映实际情况。我有一个列表列表。

标签: python list set


【解决方案1】:

解决问题的关键是一组集合:

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

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

【讨论】:

  • 谢谢。这非常有效。我不完全明白最后一行发生了什么,我把它分成了多个步骤,现在我明白了。
  • 如果它包含在其中(使用 我不知道这一点。谢谢!
  • 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(集)............输出不是我所期望的。请指教。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-12-20
  • 2023-03-26
  • 1970-01-01
相关资源
最近更新 更多