Ошибка сегментации происходит не потому, что вы используете цикл, а потому, что вы предоставляете символы не ASCII в качестве входных данных для режима выравнивания, который принимает только строковые входные данные ASCII. К счастью, Bio.pairwise2.align.globalmx
также позволяет выравнивать списки, которые содержат произвольные строки символов ASCII и не-ASCII в качестве токенов (то есть выравнивание списков строк, таких как ['ABC', 'ABD']
с ['ABC', 'GGG']
, для получения выравниваний, подобных
['ABC', 'ABD', '-' ]
['ABC', '-' , 'GGG']
или, в вашем случае, выравнивание списков не-ASCII символов, таких как ['ś', 'w', 'i', 'a', 't']
и ['w', 'y', 'r', 'z', 'u', 'c', 'i', 's', 'z']
, для получения выравниваний, таких как
['ś', 'w', '-', '-', '-', '-', '-', 'i', 'a', 't', '-', '-']
['-', 'w', 'y', 'r', 'z', 'u', 'c', 'i', '-', '-', 's', 'z']
Для этого с помощью Biopython в вашем коде замените
alignments = pairwise2.align.globalmx(source, targ,1,-0.5)
с
alignments = pairwise2.align.globalmx(list(source), list(targ), 1, -0.5, gap_char=['-'])
Так что для ввода
source = 'świat'
targ = 'wyrzucisz'
измененный код будет выдавать
[(['ś', 'w', '-', '-', '-', '-', '-', 'i', 'a', 't', '-', '-'],
['-', 'w', 'y', 'r', 'z', 'u', 'c', 'i', '-', '-', 's', 'z'],
2.0,
0,
12)]
вместо ошибки сегментации.
И поскольку каждый токен в списке имеет длину всего один символ, вы можете также преобразовать полученные выровненные списки обратно в строки, используя:
new_alignment = []
for aln in alignment:
# Convert lists back into strings
a = ''.join(aln[0])
b = ''.join(aln[1])
new_aln = (a, b) + aln[2:]
new_alignment.append(new_aln)
В приведенном выше примере new_alignment
будет тогда
[('św-----iat--', '-wyrzuci--sz', 2.0, 0, 12)]
по желанию.