sequence = [res for res in SEQ.find('CHAIN') if res.findtext('RES_POSITION') == "371"]
Здесь вы пишете SEQ.find(...)
вместо SEQ.findall(...)
.
Это то, что вы намеревались?find () находит только первое вхождение CHAIN в вашем XML-файле, и я предполагаю, что вторая часть строки (res_position == 371) будет иметь значение False для найденного элемента, поэтому последовательность будет пустойlist.
Кроме того, пока findall возвращает элементы CHAIN, findall возвращает только подэлементы CHAIN, для чего требуется адаптация if-части оператораогенератора.
Вот некоторый код, который я 'мы действительно протестировали; -):
chain = [seq for seq in SEQ.findall('CHAIN') if seq.findtext('CHAIN_ID') == "B"]
print(chain)
sequence = [res for res in SEQ.findall('CHAIN') if res.findtext('RESIDUE/RES_POSITION') == "371"]
print(sequence)
for seq in chain:
for res in sequence:
if res == seq:
print("=> %s" % res.findtext('RESIDUE/AA_CODE'))
- Поскольку строка последовательности теперь содержит элементы CHAIN, вам необходимо найти элементы RES_POSITION и AA_CODE, добавив префикс имени элемента RESIDUE.
- По той же причине вы проверяете res и seq на равенство, а не на «сдержанность» (это слово?).
Еще одно предложение - попробуйте это:
chain = [
seq for seq in SEQ.findall('CHAIN')
if seq.findtext('CHAIN_ID') == "B"
and seq.findtext('RESIDUE/RES_POSITION') == "371"
]
for seq in chain:
print("=> %s" % seq.findtext('RESIDUE/AA_CODE'))
Это гораздо эффективнее, потому что он проходит только один раз по всем вашим данным и не требует вложенного цикла for.