首先是一些生物学背景,所以你理解我的问题。在生物学中,DNA序列可以含有被酶或蛋白质识别的基序。这些主题是字符串,如“GACTGC”。分析可以揭示,图案中的位置是否“保守”。
酶可能最好地识别“GACTGC”,但也可能识别“CACTGC”甚至“TTCTGC”。所以,有些职位可能会有所不同。
我有以下情况: 我想创建一个可以识别的带有图案的排列列表。为了做到这一点,我有信息:
最佳认可:GACTGC
基地,也是可能的:
GACTGC
A C G
T A
这意味着,在第一个位置,也可能是A或T,在第4个位置可能有C等,但在第2个位置,A是守恒的,没有别的可能。
我可以通过将“最适合”的主题转换为字母列表并替换一个字母,加入并附加到我的列表(为每个位置执行此操作)来生成一个列表,其中每个位置的基数不同。所以它基本上是硬编码的。 它成功了,因为我改变了任何位置,无论输入什么主题。 但现在我想根据主题将特定位置更改为特定字母并存储特定排列。
所以,我正在寻找最短/最快/最聪明的方式,传递位置及其有效字母的信息,以及如何为一个和两个变量位置创建排列。
请注意:我会尝试在答案中或通过编辑发布我的代码,以某种方式复制粘贴然后ctrl + k对标记的代码不起作用
答案 0 :(得分:1)
使用itertools可能有办法解决这个问题,但我认为可以用自制的排列函数快速完成:
example_bases = [
"GAT", # options for first position
"A", # options for second position
"C", # ...
"TC",
"G",
"CGA"
]
def permutate(bases, results, depth=0, current_result=""):
"""Create permutations of a list of strings
All resulting strings have the length len(bases), and there will be a total
of mult([len(options) for option in bases]) total results, e.g.:
["abc", "de", "fghi"] -> 3 * 2 * 4 -> 24
:param bases: List of possible options for a base
:param results: The object which will contain all valid results
:param depth: Internal counter for current recursive depth
:param current_result: Internal variable to keep track of progress
"""
if depth == len(bases):
results.append(current_result)
else:
for base in bases[depth]:
permutate(bases, results, depth+1, current_result+base)
example_results = []
permutate(example_bases, example_results)
for sequence in example_results:
print(sequence)
打印此特定示例的18种可能组合:
GACTGC
GACTGG
GACTGA
GACCGC
GACCGG
GACCGA
AACTGC
AACTGG
AACTGA
AACCGC
AACCGG
AACCGA
TACTGC
TACTGG
TACTGA
TACCGC
TACCGG
TACCGA
如果递归不属于您的问题,或者您对代码有疑问,请随时提出。