【问题标题】:Get unique elements from a 2D list从 2D 列表中获取唯一元素
【发布时间】:2025-12-08 17:30:01
【问题描述】:

我有一个像这样创建的 2D 列表:

Z1 = [[0 for x in range(3)] for y in range(4)]

然后我继续填充此列表,使Z1 看起来像这样:

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

我需要提取Z1唯一 1x3元素,不考虑顺序:

Z2 = makeUnique(Z1) # The solution

Z2 的内容应该是这样的:

[[4, 5, 6], [2, 5, 1]]

如您所见,我认为 [1, 2, 3][2, 3, 1] 是重复的,因为我不关心顺序。

还请注意,单个数值可能在元素中出现多次(例如 [2, 3, 1][2, 5, 1]);只有当所有三个值一起出现不止一次(以相同或不同的顺序)时,我才认为它们是重复的。

我已经搜索了几十个类似的问题,但似乎没有一个能解决我的确切问题。我是一个完整的 Python 初学者,所以我只需要朝着正确的方向前进。

我已经试过了:

Z2= dict((x[0], x) for x in Z1).values() Z2= set(i for j in Z2 for i in j)

但这不会产生所需的行为。

非常感谢您的帮助!

路易斯·瓦兰斯

【问题讨论】:

  • 欢迎您!看起来您希望我们为您编写一些代码。虽然许多用户愿意为陷入困境的编码人员编写代码,但他们通常只有在发布者已经尝试自己解决问题时才会提供帮助。展示这项工作的一个好方法是包含您迄今为止编写的代码、示例输入(如果有的话)、预期输出以及您实际获得的输出(控制台输出、回溯等)。您提供的详细信息越多,您可能收到的答案就越多。检查FAQHow to Ask

标签: python list set unique


【解决方案1】:

如果子列表中元素的顺序无关,您可以使用以下内容:

from collections import Counter

z1 = [[1, 2, 3], [4, 5, 6], [2, 3, 1], [2, 5, 1]]

temp = Counter([tuple(sorted(x)) for x in z1])

z2 = [list(k) for k, v in temp.items() if v == 1]
print(z2)  # [[4, 5, 6], [1, 2, 5]]

一些备注:

  • 排序使示例中的列表[1, 2, 3][2, 3, 1] 相等,因此它们按Counter 分组
  • 转换为tuple 会将lists 转换为可散列的东西,因此可以用作dictionary 键。
  • Counter 创建一个dict,上面创建的tuples 作为键,值等于它们在原始list 中出现的次数
  • 最终的list-comprehension 会从Counter dictionary 中取出计数为1 的所有键。

如果顺序确实很重要,您可以改用以下命令:

z1 = [[1, 2, 3], [4, 5, 6], [2, 3, 1], [2, 5, 1]]

def test(sublist, list_):
    for sub in list_:
        if all(x in sub for x in sublist):
            return False
    return True

z2 = [x for i, x in enumerate(z1) if test(x, z1[:i] + z1[i+1:])]
print(z2)  # [[4, 5, 6], [2, 5, 1]]

【讨论】:

    最近更新 更多