Удаление дубликатов из списка списков, если некоторые дубликаты не имеют того же порядка [python]


Answers

Это работает, но не сохраняет порядок подсписок:

def bygroup(k):
    k = sorted(sorted(x) for x in k)
    return [k for k,_ in itertools.groupby(k)]

>>> k = [[1, 2], [4], [5, 6, 2], [1, 2], [3], [4], [2, 1]]

>>> bygroup(k)
[[1, 2], [2, 5, 6], [3], [4]]

В Python 2.7 или 3.2 вы можете использовать OrderedDict, если вам нужно сохранить порядок в подсписках, а также общий порядок списка (кроме дубликатов), но он намного медленнее:

def bydict(k):
    s = collections.OrderedDict()
    for i in k:
        s[tuple(sorted(i))] = i
    return s.values()

>>> bydict(k)
[[2, 1], [4], [5, 6, 2], [3]]

Я тестировал 100 000 итераций, используя timeit. Функция bydict в Python 2.7.2 заняла примерно 4 раза и в 3 раза больше в Python 3.2.

Question

Моя проблема очень похожа на приведенную ниже, за исключением того, что если бы существовал элемент [2,1], мне понадобилось бы это также удалить.

Python: удаление дубликатов из списка списков

Я пробовал всевозможные вещи, но просто не могу заставить его работать. Любая помощь приветствуется!

Благодарю. Ричард.