#python #python-3.x #list #permutation #itertools
#python #python-3.x #Список #перестановка #python-itertools
Вопрос:
Мне нужна помощь в решении следующей проблемы:
У меня есть список, и я хочу получить все возможные комбинации этого списка (но не путать порядок элементов подсписков и не смешивать элементы одного подсписка с другим). Итак, это мой код до сих пор:
my_list = [['x', 'y', 'z'], ['z', 't', 'z'], ['k', 't', 'x']]
print("my list is", my_list)
for x in itertools.permutations(my_list):
y = list(x)
print(y)
print("out of the loop y is", y)
Вывод:
my list is [['x', 'y', 'z'], ['z', 't', 'z'], ['k', 't', 'x']]
y is [['x', 'y', 'z'], ['z', 't', 'z'], ['k', 't', 'x']]
y is [['x', 'y', 'z'], ['k', 't', 'x'], ['z', 't', 'z']]
y is [['z', 't', 'z'], ['x', 'y', 'z'], ['k', 't', 'x']]
y is [['z', 't', 'z'], ['k', 't', 'x'], ['x', 'y', 'z']]
y is [['k', 't', 'x'], ['x', 'y', 'z'], ['z', 't', 'z']]
y is [['k', 't', 'x'], ['z', 't', 'z'], ['x', 'y', 'z']]
out of the loop y is [['k', 't', 'x'], ['z', 't', 'z'], ['x', 'y', 'z']]
Как вы можете видеть, я делаю комбинации, которые хочу получить, если я печатаю y
в цикле, но поскольку это также имеет смысл вне цикла, в памяти сохраняется только последний список для y
Как я могу сохранить все комбинации в памяти?
Ожидаемая цель кода заключается в том, что новый список будет сгенерирован позже, и ему необходимо проверить, является ли новый список одной из этих комбинаций y
. So:
...
new_list = [['z', 't', 'z'], ['x', 'y', 'z'], ['k', 't', 'x']]
if new_list in y:
print("Yeah! new_list is one of the combinations of my_list")
else:
print("Oops! Try again!")
Спасибо!
Ответ №1:
Вы могли бы сделать это более эффективно без ненужных вызовов append()
в нескольких строках кода.
import itertools
my_list = [['x', 'y', 'z'], ['z', 't', 'z'], ['k', 't', 'x']]
y = [list(x) for x in itertools.permutations(my_list)]
print("out of the loop y is", y)
new_list = [['z', 't', 'z'], ['x', 'y', 'z'], ['k', 't', 'x']]
if new_list in y:
print("Yeah! new_list is one of the permutations of my_list")
else:
print("Oops! Try again!")
Вывод кода:
out of the loop y is [[['x', 'y', 'z'], ['z', 't', 'z'], ['k', 't', 'x']], [['x', 'y', 'z'], ['k', 't', 'x'], ['z', 't', 'z']], [['z', 't', 'z'], ['x', 'y', 'z'], ['k', 't', 'x']], [['z', 't', 'z'], ['k', 't', 'x'], ['x', 'y', 'z']], [['k', 't', 'x'], ['x', 'y', 'z'], ['z', 't', 'z']], [['k', 't', 'x'], ['z', 't', 'z'], ['x', 'y', 'z']]]
Yeah! new_list is one of the permutations of my_list
Ответ №2:
Возможно, вы захотите объявить y
как список и добавить к нему новые списки:
y = []
my_list = [['x', 'y', 'z'], ['z', 't', 'z'], ['k', 't', 'x']]
print("my list is", my_list)
for x in itertools.permutations(my_list):
y.append(list(x))
print(y)
print("out of the loop y is", y)
Теперь с вашим последним фрагментом:
new_list = [['z', 't', 'z'], ['x', 'y', 'z'], ['k', 't', 'x']]
if new_list in y:
print("Yeah! new_list is one of the combinations of my_list")
else:
print("Oops! Try again!")
Вы получаете:
Yeah! new_list is one of the combinations of my_list
Ваш код может быть даже более питоническим, если вместо использования цикла вы используете понимание списков, как показано в других ответах.
Вы можете заменить:
for x in itertools.permutations(my_list):
y.append(list(x))
print(y)
С:
y = [list(x) for x in itertools.permutations(my_list)]
И получить тот же результат.
Ответ №3:
Вы можете создать свой список перестановок в понимании следующим образом:
>>> [list(p) for p in itertools.permutations(my_list)]
[[['x', 'y', 'z'], ['z', 't', 'z'], ['k', 't', 'x']],
[['x', 'y', 'z'], ['k', 't', 'x'], ['z', 't', 'z']],
[['z', 't', 'z'], ['x', 'y', 'z'], ['k', 't', 'x']],
[['z', 't', 'z'], ['k', 't', 'x'], ['x', 'y', 'z']],
[['k', 't', 'x'], ['x', 'y', 'z'], ['z', 't', 'z']],
[['k', 't', 'x'], ['z', 't', 'z'], ['x', 'y', 'z']]]
Ваш код может выглядеть так:
my_list = [['x', 'y', 'z'], ['z', 't', 'z'], ['k', 't', 'x']]
print('My list: {}'.format(my_list))
all_permutations = [list(p) for p in itertools.permutations(my_list)]
for p in all_permutations:
print('Possible permutation: {}'.format(p))
Ответ №4:
Вы можете просто преобразовать генератор в список:
list(itertools.permutations(my_list))