Удалите кортежи, которые являются дублирующими комбинациями списков в списке этих кортежей

1

У меня есть список

a = [([4, 7, 9], [3], 5.5), ([2, 5, 8], [3], 5.5), ([3], [4, 7, 9], 5.5), ([3], [2, 5, 8], 5.5)]

и я пытаюсь удалить дубликаты кортежей, которые имеют ту же комбинацию списков.

Например, ([4, 7, 9], [3], 5.5) и ([3], [4, 7, 9], 5.5) совпадают. Таким образом, результат после удаления дубликатов кортежей будет выглядеть примерно так:

a = [([4, 7, 9], [3], 5.5), ([2, 5, 8], [3], 5.5)]

с любым порядком списков в кортежах.

Изменить (на основе обратной связи @DYZ): Полностью сплющенные кортежи не допускаются. Например, (4,7,9,3,5.5) не допускается. Вывод должен по-прежнему иметь вид: ([list 1], [list2], constant).

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

Возможно ли изменить код в связанном вопросе, или есть более эффективный способ сделать это?

  • 0
    @BercoviciAdrian, что ты имеешь в виду под этим?
  • 1
    Разрешено ли вам иметь полностью сплющенные кортежи в вашем списке результатов? (Без подсписков.) Например, (4, 7, 9, 3, 5.5) .
Показать ещё 3 комментария
Теги:
list
python-3.x
duplicates
tuples

2 ответа

1
Лучший ответ

Вы можете использовать словарь для этой работы. Создайте пустой словарь:

from itertools import chain
d = {}

Вставьте каждый кортеж и его сплющенную форму в словарь как значение и ключ соответственно:

for t in a:
    # Flatten the tuple
    flat = chain.from_iterable(part if isinstance(part,list) else [part] 
                               for part in t)
    maps_to = frozenset(flat) # Sets cannot be used as keys
    d[maps_to] = t # Add it to the dict; the most recent addition "survives"

list(d.values())
#[([3], [4, 7, 9], 5.5), ([3], [2, 5, 8], 5.5)]
  • 0
    Спасибо, это работает! Прелесть словаря .. Тот, который я еще не освоил в использовании: /
2

Сортируйте элементы a по их длине (задав длину элементов, которые не перечислены как -1). Затем найдите индексы уникальных элементов результирующей сортировки и используйте их для индексирования в несортированный список.

asort = [sorted(aa, key= lambda x: len(x) if isinstance(x,list) else -1) for aa in a]
inds = [i for i,x in enumerate(asort) if asort.index(x)==i]
a = [a[i] for i in inds]
  • 0
    Спасибо за объяснение и помощь! У меня тоже отлично работает :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню