在Python 3中使用itertools.product和列表

7 投票
3 回答
9659 浏览
提问于 2025-04-15 19:40

我正在尝试根据一个蛋白质序列创建可能的密码子列表。

简单来说,我想写一个脚本,它可以处理输入的字符串,并输出这个字符串所代表的另一组字符串的所有可能组合。

举个例子,字符 '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)

当我把 poolitertools.product 中替换成 pool[0], pool[1] 时,它是可以工作的。但我不知道怎么做才能让用户输入超过两个字符的字符串(也就是说,不想把它写死)。

提前感谢你的帮助!

3 个回答

0

有时候(我觉得这种情况更常见),这个列表其实不需要打印出来:

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

pool=[F,I]
lista = []

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

lista

在这里输入图片描述

3

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

你可以用 *pool 来“拆开”列表,在调用 product() 时使用:

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

这个写法会把列表 pool 拆分成一个个单独的参数。

撰写回答