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