как получить все возможные решения для удаления повторяющихся элементов из списка (python)

#python #list

#python #Список

Вопрос:

Если у меня есть такой список [C, B, A, B], и я хочу получить все возможные решения для удаления дубликатов: [C, B, A], [C, A, B], Как я могу получить этот результат на чистом python?

Комментарии:

1. list(set([C, B, A, B])) надеюсь, это даст вам желаемый результат?

2. @SeyiDaniel вы его запустили? (в вопросе не приводятся списки результатов)

3. Согласно вопросу, порядок имеет значение, так что это не дубликат.

4. Пожалуйста, отредактируйте код вашей попытки решить эту проблему в вашем вопросе (StackOverflow не является сервисом кодирования)

5. @SeyiDaniel нет, они ожидают ["C", "B", "A"], ["C", "A", "B"]

Ответ №1:

Здесь, я полагаю, это подход, который работает. Сначала создайте сопоставление всех элементов в списке с их индексами:

 >>> from collections import defaultdict
>>> data = ['C', 'B', 'D', 'A', 'B', 'E', 'D', 'G','H','D', 'J']
>>> grouped = defaultdict(list)
>>> for i, e in enumerate(data):
...     grouped[e].append(i)
...
>>> grouped
defaultdict(<class 'list'>, {'C': [0], 'B': [1, 4], 'D': [2, 6, 9], 'A': [3], 'E': [5], 'G': [7], 'H': [8], 'J': [10]})
 

Затем вы можете просто найти произведение всех этих индексов и воссоздать список:

 >>> import itertools
>>> for idx in itertools.product(*grouped.values()):
...     idx = sorted(idx)
...     print([data[i] for i in idx])
...
['C', 'B', 'D', 'A', 'E', 'G', 'H', 'J']
['C', 'B', 'A', 'E', 'D', 'G', 'H', 'J']
['C', 'B', 'A', 'E', 'G', 'H', 'D', 'J']
['C', 'D', 'A', 'B', 'E', 'G', 'H', 'J']
['C', 'A', 'B', 'E', 'D', 'G', 'H', 'J']
['C', 'A', 'B', 'E', 'G', 'H', 'D', 'J']
 

Не уверен, что это самый элегантный. И подумайте, что есть крайний случай, когда вы получите один и тот же результат несколько раз, например ['C', 'A','A','B'] , даст ['C','A','B'], ['C','A','B'] , но неясно, нежелательно ли это, если это так, вы могли бы просто отфильтровать эти дубликаты, возможно, используя set . Но я оставлю это как упражнение для читателя 🙂