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

У меня есть список кортежей и списков в Python:

gammagammalambda = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]

Где

[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]]

совпадает с

[[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]

Итак, теперь яЯ хочу удалить эти двойные элементы, чтобы иметь

[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]

. Для этого я хочу использовать списочное понимание, и я попытался с

main_set = set(tuple(frozenset(innermost_list) for innermost_list in sublist) for sublist in gammagammalambda)

Но я получаю ошибку:

TypeError: unhashable type: 'list'

Надеюсь, вы можете мне помочь.

Ответы [ 2 ]

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

Аналогично этот ответ , list не является хэшируемым, tuple и frozenset являются хэшируемыми.

Вы можете соответственно определить «уникальность»ключ ", и используйте рецепт itertools unique_everseen , также доступный в сторонних библиотеках как toolz.unique или more_itertools.unique_everseen:

from more_itertools import unique_everseen

L = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
     [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]],
     [[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
     [[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]

def unique_everseen(x):
    return frozenset(x[0]), tuple(map(tuple, x[1][0]))

res = list(unique(L, key=unique_key))
[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
 [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]
0 голосов
/ 21 ноября 2018

Одной из альтернатив является следующее:

gammagammalambda = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
                    [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]],
                    [[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
                    [[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]

d = {frozenset(e[0]) : e for e in reversed(gammagammalambda)}
result = list(d.values())

print(result)

Вывод

[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]

Создать словарь, в котором ключи представляют значения, которые должны быть уникальными для каждогоключом установить в качестве значения весь элемент gammagammalambda, наконец уникальными значениями являются значения словаря d.

или более простой альтернативный:

gammagammalambda = [[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
                    [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]],
                    [[('r', 'u'), ('p', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]],
                    [[('r', 'w'), ('p', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]


seen = set()
result = []
for e in gammagammalambda:
    key = frozenset(e[0])
    if key not in seen:
        result.append(e)
        seen.add(key)

print(result)

Выход

[[[('p', 'u'), ('r', 'w')], [[[], ['q', 's'], ['t', 'v'], []]]], [[('p', 'w'), ('r', 'u')], [[[], ['q', 's'], ['t', 'v'], []]]]]
...