如果有人需要“先到先得”这种情况的用例,我想补充一个可能的第二个解决方案。
例如,假设我们将三个列表合并成元组列表:
a = [1,1,1,2,8,6,1]
b = [2,4,6,1,4,21,69]
c = [2,8,21,2,1,1,8]
arr = []
for i in range(len(a)):
new_row = (a[i],b[i],c[i])
arr.append(new_row)
这样我们的原始数组看起来像:
(1, 2, 2)
(1, 4, 8)
(1, 6, 21)
(2, 1, 2)
(8, 4, 1)
(6, 21, 1)
(1, 69, 8)
在我们的情况下,我们想要删除类似于(2,1,2)和(8,4,1)这样的项目,因为它们等同于分别为(1,2,2)和(1,4,8)。
为了做到这一点,我们可以使用一个名为filtered
的新空列表,并对原始数组中的每个元组使用itertools.permutations()
。
首先,我们检查每个项的任何排列是否存在于filtered
列表中。
如果不存在,则添加。如果存在,则跳过重复项。
filtered = []
for i in range(len(arr)):
it = itertools.permutations(arr[i])
perms = []
for p in it:
perms.append(p)
check = any(item in perms for item in filtered)
if not check:
filtered.append(arr[i])
现在,如果我们迭代
filtered
并打印,我们将看到我们截断的元组列表:
(1, 2, 2)
(1, 4, 8)
(1, 6, 21)
(1, 69, 8)
请注意,我们仅保留每个数字元组的第一个实例,并且不使用
set
进行操作可以确保在迭代过滤列表时具有相同的元素顺序。
唯一不确定的是以这种方式进行操作的时间/空间复杂度 - 如果有反馈,我很乐意听取。
('a', 'b') != ('b', 'a')
,更具体地说,hash(('a', 'b')) != hash(('b', 'a'))
。要做一个初始的列表推导式,对每个元组进行排序,然后转换为一个集合。 - R Nar('a','b')
和('b','a')
相等... - R Nar