2017-08-09 55 views
0

我有一个二维表独特的元素,我创建像这样:获得从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)

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

非常感谢您的帮助!

路易·瓦兰斯

+0

欢迎您!看起来你希望我们为你写一些代码。尽管许多用户愿意为遇险的编码人员编写代码,但他们通常只在海报已尝试自行解决问题时才提供帮助。证明这一努力的一个好方法是包含迄今为止编写的代码,示例输入(如果有的话),期望的输出以及实际获得的输出(控制台输出,回溯等)。您提供的细节越多,您可能会收到的答案就越多。检查[FAQ]和[问]。 – MooingRawr

回答

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
  • 转换为tuplelist转换为可哈希值,因此可用作dictionary键。
  • Counter创建具有上面创建作为键和值等于次数tuple就是他们出现在原始list
  • 最终list-comprehension一个dict通吃这些密钥从具有为1的计数Counter dictionary

如果订单确实不管你可以用下面的代替:

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