Вы можете получить желаемый результат при следующем понимании списка:
print([' '.join(names) for tup in perms for names in tup])
Объяснение поведения вашего кода:
names = ['Katia', 'Alexandre']
, поэтому
sizes = range(1, len(iterable)+1) = range(1, 3)
, поэтому
permutations = [itertools.permutations(iterable, x) for x in sizes] =
= [itertools.permutations(iterable, 1), itertools.permutations(iterable, 2)
.
itertools.permutations(iterable, 1)
содержит кортежи длины 1 из элементов итерируемого:
names = ['Katia', 'Alexandre']
for something in itertools.permutations(names, 1):
print(something) # will print ('Katia',) then ('Alexandre',)
при этом list(tup)
этого объекта перестановки будет получен список кортежей, подобных [('Catia',), ('Alexandre',)]
.
Та же логика применима к itertools.permutations(iterable, 2)
:
names = ['Katia', 'Alexandre']
for something in itertools.permutations(names, 2):
print(something) # will print ('Katia', 'Alexandre'), then ('Alexandre', 'Katia')
и list(tup)
выдаст [('Katia', 'Alexandre'), ('Alexandre', 'Katia')]
Объединение их в понимание списка [list(tup) for tup in perms]
даст вывод, который вы получите: [[('Catia',), ('Alexandre',)], [('Catia', 'Alexandre'), ('Alexandre', 'Catia')]]
Изменение понимания списка на [list(tup) for tup in [iterator for iterator in perms]]
ничего не делает: perms
isуже список и [iterator for iterator in perms]
эквивалентен perms
.