如何基于以下条件从列表中删除重复的元组:如果(Y, Z)
和(Z, Y)
是列表的一部分,那么我们只保留匹配项Y < Z
?
例如,如果我们从以下汽车ID对列表开始:
CarID1 = [(100, 500), (100, 600), (100, 700), (500, 100), (500, 200)],
然后我们应该删除(500, 100
条目并以:
CarID2 = [(100, 500), (100, 600), (100, 700), (500, 200)]
我尝试了以下代码来获取唯一的元组,但是它没有实现我所描述的。
y = np.unique(x, axis=0)
z = []
for i in y:
z.append(tuple(i))
答案 0 :(得分:3)
使用字典可以在线性时间内完成。
请注意,对于每个元组(u,v)
,我首先检查(v,u)
是否已经存在,在这种情况下,我将其与u < v
一起保存,否则将其插入字典中。
CarID1 = [(100, 500), (100, 600), (100, 700), (500, 100), (500, 200)]
d ={}
for (u, v) in CarID1:
if (v, u) in d:
d[(v,u)] = (u,v) if u < v else (v,u)
else:
d[(u,v)] = (u,v)
d.values()
#dict_values([(100, 500), (100, 600), (100, 700), (500, 200)])
答案 1 :(得分:0)
您可以使用列表理解:
[(y, z) for y, z in CarID1 if (z, y) not in CarID1 or y < z]
如果O(n)运行时很重要,则使用一个set,该set也将处理重复项,但可能不能保证相同的顺序:
CarID1_distinct = set(CarID1)
[(y, z) for y, z in CarID1 if (z, y) not in CarID1_distinct or y < z]
答案 2 :(得分:0)
z = [(a, b) for a, b in carID1 if not ( (b, a) in CarID1 and b > a) ]
这是一个列表推导,它考虑了原始列表中的所有对(a,b)。保留所有 ,其中反向对也在列表中,并且元素的排列顺序不符合要求。
输出:
>>> z
[(100, 600), (100, 700), (500, 100), (500, 200)]