我正在尝试生成一个长度为四个字符的所有可能DNA序列的列表,这四个字符为A
、T
、C
和G
。总共有4^4(256)种不同的组合。我包括重复的,因此AAAA
是允许的。
我查看了itertools.combinations_with_replacement(iterable, r)
但是,输出列表会根据输入字符串的顺序而改变。
itertools.combinations_with_replacement('ATCG', 4) #diff results to...
itertools.combinations_with_replacement('ATGC', 4)
因此,我尝试将
itertools.combinations_with_replacement(iterable, r)
与itertools.permutations()
结合起来。
这样可以将itertools.permutations()
的输出传递给itertools.combinations_with_replacement()
。定义如下:
def allCombinations(s, strings):
perms = list(itertools.permutations(s, 4))
allCombos = []
for perm in perms:
combo = list(itertools.combinations_with_replacement(perm, 4))
allCombos.append(combo)
for combos in allCombos:
for tup in combos:
strings.append("".join(str(x) for x in tup))
然而,当 li = []
时,运行 allCombinations('ATCG', li)
,然后使用 list(set(li))
仍然只会生成136个唯一的序列,而不是256个。
必须有一种简单的方法来解决这个问题,也许是生成一个幂集,然后过滤长度为4的子集?
itertools.product('ATCG', repeat=4)
? - ayhansorted([ a+b+c+d for a in 'ATCG' for b in 'ATCG' for c in 'ATCG' for d in 'ATCG' ])
- nigel222