Удалите дублирующиеся элементы в массиве с неодинаково упорядоченными внутренними элементами - PullRequest
0 голосов
/ 17 марта 2020

Наш список примеров:

(
    [(), (2, 0)], 
    [(2,), (0,)], 
    [(), (0, 2)], 
    [(0,), (2,)]
)

Я хочу иметь возможность удалять дубликаты в списке, и под этим я подразумеваю одни и те же внутренние элементы.

Это означает элементы [(2,), (0,)] и [(0,), (2,)] в списке одинаковы. Итак, в заключение, я хочу удалить другой порядок внутри элементов. Обратите внимание, что этот пример имеет 2 внутри элементов, но я хочу его для любого числа. Я хочу сохранить все, что будет на первом месте, пока их нет (или у нас много дубликатов).

Я думал о сортировке внутренних элементов, преобразовании их в str, проверке на дубликаты, но я не конечно, если это так, и я не знаю, как это сделать

Например, элемент [(),(2,0),(1,)] такой же, как [(),(1,),(2,0)].

Ответы [ 2 ]

2 голосов
/ 18 марта 2020

вы можете использовать fozensets :

l = (
    [(), (2, 0)], 
    [(2,), (0,)], 
    [(), (0, 2)], 
    [(0,), (2,)]
)


r = set()

result = tuple()
for e in l:
    f = frozenset(e)
    if f not in r:
        result += (e,)
        r.add(f)
result

вывод:

([(), (2, 0)], [(2,), (0,)], [(), (0, 2)]

если порядок списков не важен, вы можете использовать:

tuple(list(e) for e in {frozenset(e) for e in l})

вывод:

([(), (0, 2)], [(2,), (0,)], [(2, 0), ()])
0 голосов
/ 18 марта 2020

Одним из способов решения этой проблемы является сортировка значений в списке и удаление проверки, если n-й элемент существует в следующей части списка

from itertools import compress

lst = (
    [(), (2, 0)], 
    [(2,), (0,)], 
    [(), (0, 2)], 
    [(0,), (2,)]
)

_ = list(map(lambda x: x.sort(), lst))
list(compress(lst, [x not in lst[i+1:] for i, x in enumerate(lst)]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...