【问题标题】:How do you remove duplicates from a three dimensional list?如何从三维列表中删除重复项?
【发布时间】:2020-02-04 21:57:03
【问题描述】:

我在编写哪些代码以允许我通过使用列表理解从三维列表中删除重复项时遇到一些问题?下面是我的列表和示例。

df = [[[3, 7, 9, 28],[3, 7, 9, 28],[3, 7, 9, 28],[3, 7, 17, 28],[7, 25, 27, 28], [7, 17, 21, 27, 28]],[[3, 4, 28],[4, 7, 28],[4, 7, 28],[3, 4, 28],[4, 7, 14, 28],[3, 14, 28],[3, 4, 28],[3, 7, 14, 28]],[[7, 11, 28],[3, 11, 28],[3, 7, 12, 28],[7, 11, 12, 28],[3, 11, 12, 28],[7, 25, 27, 28],[3, 7, 11, 28]]]

我希望我的结果是:

df1 = [[[3, 7, 9, 28],[3, 7, 17, 28],[7, 25, 27, 28],[7, 17, 21, 27, 28]],[[3, 4, 28],[4, 7, 28],[4, 7, 14, 28],[3, 14, 28],[3, 7, 14, 28]],[[7, 11, 28],[3, 11, 28],[3, 7, 12, 28],[7, 11, 12, 28],[3, 11, 12, 28],[3, 7, 11, 28]]]

【问题讨论】:

  • 为什么需要它作为列表理解?这将是非常低效的,因为您必须多次迭代 df 列表以搜索它是否是在插入它之前的第一次出现。如果您使用集合来存储已插入的元素并使用普通循环,您将获得更有效的解决方案。
  • [3, 7, 11, 28] 怎么样?存在列表推导以简化工作。但在这种情况下,我认为它们弊大于利,因为代码看起来非常复杂。
  • 旁注:如果[3, 7, 9, 28] 代表什么,它们可能应该是某种自定义对象而不是列表。 class__slots__ 在内存方面应该是有效的。如果您需要对代码的其他部分进行迭代,则可以为类提供迭代功能。使用列表、元组和字典来存储我闻到的所有东西。
  • 那么,如果不能通过列表理解来完成,我该如何让它工作
  • 我已经给了你同样的答案。

标签: python python-3.x list multidimensional-array duplicates


【解决方案1】:

您可以通过在插入列表之前检查列表是否已经存在来避免这种混乱。这样可以避免复杂的循环。

编辑:我知道这不是您直接想要的,但我认为不需要列表理解。更容易继续执行以下操作:

EDIT2 :按要求添加排序版本。使用每个 2d 列表的索引位置作为键,并使用列表的 .sort() 功能对它们进行排序。

res = []
for dflist in df:
    df_set = set(tuple(y) for y in dflist)
    innerlist = [list(x) for x in df_set]
    innerlist.sort(key = lambda x: dflist.index(x))
    res.append(innerlist)

【讨论】:

  • 这已经足够好并且可以理解,但是如何对内部列表进行排序
  • 在 EDIT2 中添加了相同的位
  • @CyrusDsouza 没有你我该怎么办?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 2019-04-01
  • 1970-01-01
  • 2019-12-07
  • 2023-03-05
  • 1970-01-01
相关资源
最近更新 更多