Где в моем коде удаляются дубликаты?

#python #permutation

#python #перестановка

Вопрос:

Важной частью моего вывода является возможность определить длину finalList , но где-то в моем коде дубликаты удаляются, и я не могу понять, где

 from itertools import chain, permutations
allPos = []
first_list = ['a','b','c']
match_list = [['a','b','c'], ['a','b','c']]

for i in range(1,30):
    for phrase in permutations(first_list, i):
        for ind, letter in enumerate(chain.from_iterable(phrase)):
             if ind >= len(match_list) or letter not in match_list[ind]:
                break
        else:
            allPos.append(phrase)

finalList = []

for i in allPos:
    if len(i) == len(allPos[-1]):
        finalList.append(i)

print(finalList)
  

ВЫВОД

 [('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'c'), ('c', 'a'), ('c', 'b')]
  

Я знаю, что он удаляет дубликаты, или, возможно, в моем коде просто чего-то не хватает, потому что я пропускаю [('a','a'), ('b','b'), ('c','c')] свой вывод

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

1. Здесь: permutations ?

2. должен ли ваш блок else иметь отступ?

3. Я прочитал документы @zvone

4. да, предполагается, что он должен иметь отступ @kpie

5. Я хотел сказать, что функция permutations не возвращает дубликаты.

Ответ №1:

Вы можете попробовать с этим. Изменение iterable с помощью перестановок.

 from itertools import chain, permutations
...
...
for i in range(1,30):
    # change iterable
    for phrase in permutations([j for ele in match_list for j in ele], i):

...
for i in set(allPos):
    if len(i) == len(allPos[-1]):
        finalList.append(i)

print (sorted(finalList))
[('a', 'a'), ('a', 'b'), ('a', 'c'), ('b', 'a'), ('b', 'b'), ('b', 'c'), ('c', 'a'), ('c', 'b'), ('c', 'c')]