#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 . Но я оставлю это как упражнение для читателя 🙂