假設我有一個字母:生成動態列表解析在Python
A = ['A', 'T', 'C', 'G']
我想生成長度N(N-MER)的每一個可能的組合。例如對於n=2: AA, AT, ..., GG
。爲了讓事情變得有趣,我正在試驗用動態的方式生成列表解析。這在Python中可能嗎?唯一明顯的方法是使用eval()
並動態生成所需的字符串。不過,我很好奇,看看有沒有一種笨重的方法。
假設我有一個字母:生成動態列表解析在Python
A = ['A', 'T', 'C', 'G']
我想生成長度N(N-MER)的每一個可能的組合。例如對於n=2: AA, AT, ..., GG
。爲了讓事情變得有趣,我正在試驗用動態的方式生成列表解析。這在Python中可能嗎?唯一明顯的方法是使用eval()
並動態生成所需的字符串。不過,我很好奇,看看有沒有一種笨重的方法。
>>> 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')]
長度爲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千等...
假設你不希望同時'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']
@JoshLee - 謝謝。更新。 :) – mgilson