从2D列表中获取唯一元素

时间:2017-08-09 13:42:44

标签: python list set unique

我有一个我创建的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]]

我需要提取1x3唯一 Z1元素,而不考虑订单:

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)

但这不会产生预期的行为。

非常感谢你的帮助!

Louis Vallance

1 个答案:

答案 0 :(得分: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会将list转换为可清除的内容,因此可用作dictionary密钥。
  • Counter创建一个dict,上面创建的tuple为关键字,值等于它们在原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]]