Получить все возможные комбинации списков и сохранить их в памяти

#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))