Продукт itertools для генерации всех возможных строк размера 3

Вход:

pos_1= 'AVNMHDRW' 
pos_2= 'KNTHDYBW'
pos_3= 'KVNGSDRB'

Попытка найти все возможные триплеты, используя один элемент из pos_1, один из pos_2 и один из pos_3.

Я пытаюсь понять, как использовать itertools.product(*), но немного запутался

В конечном счете, я хочу создать список (или объект-генератор) всех различных возможностей, взяв одну из pos_1, затем одну из pos_2, а затем одну из pos_3.

Пример вывода:

'AKK','ANV','WWB'

pos_1 обозначает позицию один и так далее для pos_2 и pos_3.


person O.rka    schedule 11.12.2014    source источник
comment
Не уверен, зачем вам нужен продукт, но вы можете сделать генератор просто как g = ( [v1,v2,v3] for v1 in pos_1 for v2 in pos_2 for v3 in pos_3)   -  person Marcin    schedule 11.12.2014


Ответы (3)


Простой:

itertools.product(pos_1, pos_2, pos_3)

Это можно повторять; если вам нужен список, просто передайте его list.

В чем именно проблема?

Изменить: это создает кортежи элементов из каждого источника. Если вы хотите соединить их обратно в строки, вы можете сделать это вручную при повторении:

for a, b, c in itertools.product(pos_1, pos_2, pos_3):
    do_something_with(a + b + c)

или для создания списка вы можете использовать понимание списка:

[a + b + c for a, b, c in itertools.product(pos_1, pos_2, pos_3)]
person Karl Knechtel    schedule 11.12.2014
comment
Или для развлечения, map(''.join, itertools.product(pos_1, pos_2, pos_3)) - person Steve Jessop; 27.07.2016

См. этот ответ: В Python есть краткий способ понимания списка с несколькими итераторами.

В твоем случае:

triples = [ a+b+c for a in pos_1 for b in pos_2 for c in pos_3 ]
person ErikR    schedule 11.12.2014

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

g = (v1+v2+v3  for v1 in pos_1 for v2 in pos_2 for v3 in pos_3)
person Marcin    schedule 11.12.2014