Python: удаление почти дубликатов из списка объектов - PullRequest
0 голосов
/ 03 ноября 2018

Как я могу удалить все кортежи в следующем списке кортежей , где только один определенный индекс никогда не является дубликатом ? В этом случае мне нужно удалить дубликаты каждого второго значения кортежа (он же индекс 1).

[(1051,97),(1051,132),(1048,132),(1048,283),(1048,438)]
                 ^^^        ^^^

Желаемый вывод:

[(1051,97),(1051,132),(1048,283),(1048,438)]

Бонусные баллы за возможность сохранить приоритет первого порядка, показанный в желаемом выводе выше.

Ответы [ 4 ]

0 голосов
/ 03 ноября 2018

Создание обратного словаря. Поскольку ключи словаря всегда уникальны, дубликаты будут естественным образом удалены:

l = [(1051,97),(1051,132),(1048,132),(1048,283),(1048,438)]
[(x,y) for y,x in {y:x for x,y in l}.items()]
#[(1051, 97), (1048, 132), (1048, 283), (1048, 438)]

Это решение не сохраняет порядок.

0 голосов
/ 03 ноября 2018
lst = [(1051,97),(1051,132),(1048,132),(1048,283),(1048,438)]
lst = list(reversed([(v, k) for k, v in {t[1]: t[0] for t in reversed(lst)}.items()]))
print(lst)
# [(1051, 97), (1051, 132), (1048, 283), (1048, 438)]
0 голосов
/ 03 ноября 2018

Использование pandas

df = pd.DataFrame(l)
df.loc[df[1].drop_duplicates().index].values.tolist()
0 голосов
/ 03 ноября 2018

Вы можете поддерживать набор всех элементов индекса 1, с которыми вы сталкиваетесь при итерации, и включать кортежи в конечный результат, только если его элемент индекса 1 не встречался:

lst = [(1051,97),(1051,132),(1048,132),(1048,283),(1048,438)]

s = set()
res = []
for i, j in lst:
    if j not in s:
        s.add(j)
        res.append((i,j))

print(res)
# [(1051, 97), (1051, 132), (1048, 283), (1048, 438)]
...