假设我有一个字母表:
A = ['A', 'T', 'C', 'G']
我想生成长度 n(n-mer)的所有可能组合。例如对于n=2: AA, AT, ..., GG
. 为了让事情变得有趣,我正在尝试以动态方式使用列表推导生成这些。这在python中可能吗?唯一明显的方法是eval()
动态使用和生成所需的字符串。但是,我很好奇是否有一种不那么笨重的方法。
假设我有一个字母表:
A = ['A', 'T', 'C', 'G']
我想生成长度 n(n-mer)的所有可能组合。例如对于n=2: AA, AT, ..., GG
. 为了让事情变得有趣,我正在尝试以动态方式使用列表推导生成这些。这在python中可能吗?唯一明显的方法是eval()
动态使用和生成所需的字符串。但是,我很好奇是否有一种不那么笨重的方法。
长度为 2 的每一个可能都是 - (但你可能在 之后permutations
,combinations
或者combinations_with_replacement
从itertools
......)
from itertools import product
A = ['A', 'T', 'C', 'G']
print list(product(A, repeat=2))
[('A', 'A'), ('A', 'T'), ('A', 'C'), ('A', 'G'), ('T', 'A'), ('T', 'T'), ('T', 'C'), ('T', 'G'), ('C', 'A'), ('C', 'T'), ('C', 'C'), ('C', 'G'), ('G', 'A'), ('G', 'T'), ('G', 'C'), ('G', 'G')]
[(a,b) for a in A for b in A]
如果您想要 3、4、1000 等,这相当于但更容易扩展......
>>> from itertools import combinations
>>> A = ['A', 'T', 'C', 'G']
>>> print list(combinations(A,2))
[('A', 'T'), ('A', 'C'), ('A', 'G'), ('T', 'C'), ('T', 'G'), ('C', 'G')]
或者可能(以获得重复):
>>> from itertools import combinations_with_replacement
>>> print list(combinations_with_replacement(A,2))
[('A', 'A'), ('A', 'T'), ('A', 'C'), ('A', 'G'), ('T', 'T'), ('T', 'C'), ('T', 'G'), ('C', 'C'), ('C', 'G'), ('G', 'G')]
假设您不想要两者'AT'
和'TA'
,那么itertools.combinations_with_replacement()
可能就是您要查找的内容:
>>> from itertools import combinations_with_replacement
>>> A = ['A', 'T', 'C', 'G']
>>> [''.join(x) for x in combinations_with_replacement(A, 2)]
['AA', 'AT', 'AC', 'AG', 'TT', 'TC', 'TG', 'CC', 'CG', 'GG']