从二维列表中获取唯一元素

Get unique elements from a 2D list

我有一个二维列表,我是这样创建的:

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

我需要提取 Z1unique 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]);只有当所有三个值一起出现不止一次(以相同或不同的顺序)时,我才认为它们是重复的。

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

我已经试过了:

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

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

非常感谢您的帮助!

路易斯·瓦朗斯

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

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
  • 分组
  • 转换为 tuplelist 转换为可散列的内容,因此可以用作 dictionary 键。
  • Counter 创建一个 dict,上面创建的 tuple 作为键,值等于它们在原始 list[ 中出现的次数=39=]
  • 最后的 list-comprehensionCounter 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]]