Итеративное преобразование типов по списку итераций - PullRequest
1 голос
/ 27 сентября 2019

У меня есть такой список строк:

names = ['Katia', 'Alexandre']

и я хочу достичь этого результата:

['Katia', 'Alexandre', 'Katia Alexandre', 'Alexandre Katia']

т.е. Мне нужны все перестановкиразмером диапазон (1, длина (имена) +1) .

Я написал эту функцию, которая создает список повторяемых элементов:

import itertools

def permutations_all_sizes(iterable):
    sizes = range(1, len(iterable)+1)
    permutations = [itertools.permutations(iterable, x) for x in sizes]

    return permutations

Теперь моя идеядолжен был выполнить понимание вложенного списка, чтобы расстроить строки.Однако, где бы я ни делал, вложенный или не вложенный, результат всегда один и тот же:

perms = permutations_all_sizes(names)

[list(tup) for tup in perms]
[162]: [[('Catia',), ('Alexandre',)], [('Catia', 'Alexandre'), ('Alexandre', 'Catia')]]

[list(tup) for tup in [iterator for iterator in perms]]
[165]: [[('Catia',), ('Alexandre',)], [('Catia', 'Alexandre'), ('Alexandre', 'Catia')]]

Может кто-нибудь объяснить, почему такое поведение?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Вы можете использовать метод ' '.join, чтобы объединить кортеж строк в строку, разделенную пробелом:

def permutations_all_sizes(iterable):
    sizes = range(1, len(iterable)+1)
    permutations = [' '.join(permutation) for x in sizes for permutation in itertools.permutations(iterable, x)]
    return permutations
1 голос
/ 27 сентября 2019

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

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.

...