【发布时间】:2020-02-13 14:17:36
【问题描述】:
我遇到了一个问题,我需要返回的应该是列表列表,每个嵌套列表都是 2 个字符串的列表。我找不到有效地展平此列表或仅返回列表列表的方法,因为嵌套列表的数量无法确定。这发生在我的递归函数中,我为每个递归循环分支到 3 个不同的递归路径。 到目前为止我所拥有的是:
def f(used, sequences):
if sequences[0] == '' or sequences[1] == '':
if sequences[0] == '' and sequences[1] == '':
return [used[0], used[1]]
elif sequences[0] != '':
return [used[0] + sequences[0], used[1] + '-' * len(sequences[0])]
elif sequences[1] != '':
return [used[0] + '-' * len(sequences[1]), used[1] + sequences[1]]
else:
return [f([sequences[0][-1] + used[0], sequences[1][-1] + used[1]], [sequences[0][:-1], sequences[1][:-1]]),
f([sequences[0][-1] + used[0], '-' + used[1]], [sequences[0][:-1], sequences[1]]),
f(['-' + used[0], sequences[1][-1] + used[1]], [sequences[0], sequences[1][:-1]])]
我想要的对齐是两个序列配对的所有可能对齐。但是,它会产生一系列复杂的嵌套循环,由于序列的长度可能不同,因此无法确定。这样使用上述函数会产生:
sequences = ['GAA', 'TGT']
alignments = f(['', ''], sequences)
print(alignments)
>>>[[[['GAA', 'TGT'], ['GAA-', '-GTT'], ['-AAG', 'TGT-']], [['GAA-', 'G-TT'], ['GAA--', '--TTG'], [['G-AA', 'TG-T'], ['G-AA-', '-G-TT'], ['--AAG', 'TG-T-']]], [['A-AG', 'TGT-'], [['GA-A', 'T-GT'], ['GA-A-', '--GTT'], ['-A-AG', 'T-GT-']], ['--AGA', 'TGT--']]], [[['GAA-', 'GT-T'], ['GAA--', '-T-TG'], [['G-AA', 'TGT-'], ['G-AA-', '-GT-T'], ['--AAG', 'TGT--']]], [['GAA--', 'T--TG'], ['GAA---', '---TGT'], [['G-AA-', 'GT--T'], ['G-AA--', '-T--TG'], [['G--AA', 'TGT--'], ['G--AA-', '-GT--T'], ['---AAG', 'TGT---']]]], [[['GA-A', 'TGT-'], ['GA-A-', '-GT-T'], ['-A-AG', 'TGT--']], [['GA-A-', 'G-T-T'], ['GA-A--', '--T-TG'], [['G-A-A', 'TG-T-'], ['G-A-A-', '-G-T-T'], ['--A-AG', 'TG-T--']]], [['A--AG', 'TGT--'], [['GA--A', 'T-GT-'], ['GA--A-', '--GT-T'], ['-A--AG', 'T-GT--']], ['---AGA', 'TGT---']]]], [[['AA-G', 'TGT-'], [['GAA-', 'T-GT'], ['GAA--', '--GTT'], ['-AA-G', 'T-GT-']], ['-A-GA', 'TGT--']], [[['GAA-', 'TG-T'], ['GAA--', '-G-TT'], ['-AA-G', 'TG-T-']], [['GAA--', 'G--TT'], ['GAA---', '---TTG'], [['G-AA-', 'TG--T'], ['G-AA--', '-G--TT'], ['--AA-G', 'TG--T-']]], [['A-A-G', 'TG-T-'], [['GA-A-', 'T-G-T'], ['GA-A--', '--G-TT'], ['-A-A-G', 'T-G-T-']], ['--A-GA', 'TG-T--']]], [['A--GA', 'TGT--'], [['AA--G', 'T-GT-'], [['GAA--', 'T--GT'], ['GAA---', '---GTT'], ['-AA--G', 'T--GT-']], ['-A--GA', 'T-GT--']], ['---GAA', 'TGT---']]]]
当我希望它以[['str', 'str'], ['str', 'str'], ['str', 'str']... 出现时,它会生成类似[[[['str', 'str'], ['str', 'str'], ['str', 'str']], [['str, 'str']... 的东西
有没有办法解决我的递归问题,或者我可以编写一个函数来按我想要的方式展平它?
尝试过 Ch3steR 的推荐:
def flat(lst):
if not isinstance(lst[0][0],list):
return lst
else:
return flat(sum(lst,[]))
我离我想要的更近了。不过里面还是有一些嵌套循环。
sequences = ['GAA', 'TGT']
alignments = f(['', ''], sequences)
alignments = flat(alignments)
print(alignments)
现在产生:
[['GAA', 'TGT'], ['GAA-', '-GTT'], ['-AAG', 'TGT-'], ['GAA-', 'G-TT'], ['GAA--', '--TTG'], [['G-AA', 'TG-T'], ['G-AA-', '-G-TT'], ['--AAG', 'TG-T-']], ['A-AG', 'TGT-'], [['GA-A', 'T-GT'], ['GA-A-', '--GTT'], ['-A-AG', 'T-GT-']], ['--AGA', 'TGT--'], ['GAA-', 'GT-T'], ['GAA--', '-T-TG'], [['G-AA', 'TGT-'], ['G-AA-', '-GT-T'], ['--AAG', 'TGT--']], ['GAA--', 'T--TG'], ['GAA---', '---TGT'], [['G-AA-', 'GT--T'], ['G-AA--', '-T--TG'], [['G--AA', 'TGT--'], ['G--AA-', '-GT--T'], ['---AAG', 'TGT---']]], [['GA-A', 'TGT-'], ['GA-A-', '-GT-T'], ['-A-AG', 'TGT--']], [['GA-A-', 'G-T-T'], ['GA-A--', '--T-TG'], [['G-A-A', 'TG-T-'], ['G-A-A-', '-G-T-T'], ['--A-AG', 'TG-T--']]], [['A--AG', 'TGT--'], [['GA--A', 'T-GT-'], ['GA--A-', '--GT-T'], ['-A--AG', 'T-GT--']], ['---AGA', 'TGT---']], ['AA-G', 'TGT-'], [['GAA-', 'T-GT'], ['GAA--', '--GTT'], ['-AA-G', 'T-GT-']], ['-A-GA', 'TGT--'], [['GAA-', 'TG-T'], ['GAA--', '-G-TT'], ['-AA-G', 'TG-T-']], [['GAA--', 'G--TT'], ['GAA---', '---TTG'], [['G-AA-', 'TG--T'], ['G-AA--', '-G--TT'], ['--AA-G', 'TG--T-']]], [['A-A-G', 'TG-T-'], [['GA-A-', 'T-G-T'], ['GA-A--', '--G-TT'], ['-A-A-G', 'T-G-T-']], ['--A-GA', 'TG-T--']], ['A--GA', 'TGT--'], [['AA--G', 'T-GT-'], [['GAA--', 'T--GT'], ['GAA---', '---GTT'], ['-AA--G', 'T--GT-']], ['-A--GA', 'T-GT--']], ['---GAA', 'TGT---']]
【问题讨论】:
-
参数的值是多少?请edit您的问题和数据以及minimal reproducible example
-
请详细说明嵌套列表的外观。
-
@OcasoProtal 抱歉最初含糊不清。我已更新问题以显示我使用和收到的输入和输出
-
@Jameseph 检查我现在发布的已编辑答案。
标签: python python-3.x list recursion nested-lists