Python 3.4.3 - Как сохранить список itertools.permutations для использования?

Я перепробовал много решений своей проблемы, но пока не нашел решения.

import itertools

a = ['car','boat','plane']
b = list(itertools.permutations(a,))
print(b)

Это дает этот список при печати.

[('car', 'boat', 'plane'), ('car', 'plane', 'boat'), ('boat', 'car', 'plane'), ('boat', 'plane', 'car'), ('plane', 'car', 'boat'), ('plane', 'boat', 'car')]

Но это не для меня. Мне нужно что-то подобное:

car boat plane
car plane boat
boat car plane
boat plane car
plane car boat
plane boat car

Пробел между словами, без запятой и 1 в строке.

Это был просто пример, потому что у меня есть фразы по 20 слов в каждом, и мне нужно сделать это с каждым.

Теперь просто реальный образец того, что я должен сделать.

import itertools
'phrase What are you doing to this cat?'
a = ['what','are','you','doing','to','this','cat?']
b = list(itertools.permutations(a,))
print(b)

Результатом станет монстр.

5 ответов

Решение

Просто распакуйте кортежи, возвращенные itertools.permutations(a,) и for цикл:

import itertools
a = 'what are you doing to this cat?'.split()
for permutation in itertools.permutations(a,):
    print(*permutation)

С помощью .split() на этой фразе будет легче менять предложение.

Если вы хотите получить ту фактическую строку, которую вы описали, вы можете сделать это с двумя join звонки

'\n'.join(' '.join(r) for r in b)

Внутренний join объединяет элементы каждой строки с ' ' отделяя их, внешнее соединение затем объединяет строки с '\n' между ними. Вы можете распечатать вышеизложенное напрямую или сохранить в переменной

Вам просто нужно сделать строковое соединение с ',' для каждого элемента каждой записи из itertools.permutations, а затем соединить каждую запись вместе с '\n'. Вот оно с выражением генератора:

import itertools

a = ['car','boat','plane']
b = itertools.permutations(a)
s = '\n'.join((','.join(permutation) for permutation in b))
print(s)

pprint.pprint часто полезно для проверки данных. Это не дает вам именно ту форму, которую вы хотите в этом случае, но она дает полезную форму.

Код:

import itertools
from pprint import pprint

a = ['car','boat','plane']
b = list(itertools.permutations(a,))
pprint(b)

Результат:

[('car', 'boat', 'plane'),
 ('car', 'plane', 'boat'),
 ('boat', 'car', 'plane'),
 ('boat', 'plane', 'car'),
 ('plane', 'car', 'boat'),
 ('plane', 'boat', 'car')]

Вам просто нужно немного отформатировать его. Соедините элементы пробелом и отделите их новой строкой.

print(*(' '.join(item) for item in itertools.permutations(a,)), sep='\n')

В качестве альтернативы:

for item in itertools.permutations(a,):
    print(' '.join(item))
Другие вопросы по тегам