Удаление дубликатов из списка списков, если некоторые дубликаты не имеют одинаковый порядок - PullRequest
2 голосов
/ 17 июля 2011

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

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

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

Спасибо.

Ответы [ 2 ]

1 голос
/ 17 июля 2011

Может быть, вы действительно хотите set из set с

unique = set(map(set, list_of_lists))

Редактировать: хорошо, но это не работает. увы, наборы не могут содержать наборы, потому что наборы не хранимы. frozenset есть, однако:

unique = set(map(frozenset, list_of_lists))
1 голос
/ 17 июля 2011

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

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 заняла примерно в 4 раза больше времени в Python 2.7.2 и примерно в 3 раза больше в Python 3.2.

...