Работа с itertools.product и списками в Python 3 - PullRequest
6 голосов
/ 24 февраля 2010

Я пытаюсь создать возможный список кодонов с учетом последовательности белка.

По сути, скрипт, который я пытаюсь создать, будет обрабатывать заданный ввод строки и выводить возможные комбинации другого набора строк, которые представляет ввод.

Например, символ «F» представляет собой «UUU» или «UUC»; символ «I» представляет собой «AUU», «AUC» или «AUA».

Учитывая ввод 'FI', скрипт, который я пытаюсь создать, должен вывести: 'UUUAUU', 'UUUAUC', 'UUUAUA', 'UUCAUU', 'UUCAUC' и 'UUCAUA'.

В настоящее время я застрял с этим кодом:

import itertools

F = ['UUU', 'UUC']
I = ['AUU', 'AUC', 'AUA']

seq, pool = 'FI', []

for i in seq:
   pool.append(eval(i))

for n in itertools.product(pool):
   print(n)

Работает, когда я заменяю pool в itertools.product на pool[0], pool[1]. Но я не могу понять, как заставить его работать так, чтобы пользователь мог вводить строку с более чем 2 символами (то есть не делать это жестко).

Заранее спасибо за помощь!

Ответы [ 2 ]

7 голосов
/ 24 февраля 2010

Вы можете использовать *pool для распаковки списка при вызове product():

for n in itertools.product(*pool):
   print(n)

Этот синтаксис расширяет список pool в отдельные позиционные параметры.

3 голосов
/ 24 февраля 2010

itertools.product (pool [0], pool [1], ... pool [len (pool) -1]) эквивалентен itertools.product (* pool)

import itertools

F = ['UUU', 'UUC']
I = ['AUU', 'AUC', 'AUA']

pool=[F,I]

for n in itertools.product(*pool):
   print(''.join(n))
...