按条件删除重复的元组对

时间:2018-08-27 23:52:59

标签: python numpy

如何基于以下条件从列表中删除重复的元组:如果(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))

3 个答案:

答案 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)]