从二维列表中获取唯一元素
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]]
我需要提取 Z1
的 unique 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
分组
- 转换为
tuple
将 list
转换为可散列的内容,因此可以用作 dictionary
键。
Counter
创建一个 dict
,上面创建的 tuple
作为键,值等于它们在原始 list
[ 中出现的次数=39=]
- 最后的
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]]
我有一个二维列表,我是这样创建的:
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
的 unique 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
分组
- 转换为
tuple
将list
转换为可散列的内容,因此可以用作dictionary
键。 Counter
创建一个dict
,上面创建的tuple
作为键,值等于它们在原始list
[ 中出现的次数=39=]- 最后的
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]]