Удаление дубликатов пар кортежей по условию - PullRequest
0 голосов
/ 28 августа 2018

Как удалить дубликаты кортежей из списка на основе условия, что если (Y, Z) и (Z, Y) являются частью списка, то мы сохраняем совпадение только там, где Y < Z?

Например, если мы начнем со следующего списка пар идентификаторов автомобилей:

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 голосов
/ 28 августа 2018
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)]
0 голосов
/ 28 августа 2018

Используя словарь, вы можете сделать это за линейное время.
Обратите внимание, что для каждого кортежа (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)])
0 голосов
/ 28 августа 2018

Вы можете использовать понимание списка:

[(y, z) for y, z in CarID1 if (z, y) not in CarID1 or y < z]

И если важно время выполнения O (n), используйте набор, который также позаботится о дубликатах, но может не гарантировать тот же порядок:

CarID1_distinct = set(CarID1)
[(y, z) for y, z in CarID1 if (z, y) not in CarID1_distinct or y < z]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...