Индексирование для SeqRecords - PullRequest
0 голосов
/ 28 мая 2020

Я хотел бы получить список индексов для SeqRecords, которые находятся в списке f. Я пробовал это:

for x in f:
    ind = f.index(x)
    print(ind)

Но получаю сообщение об ошибке:

0
Traceback (most recent call last):

File "C:\Users\Adrian\Desktop\Sekwencje\skrypt 1.py", line 43, in <module>
  ind = f.index(x)

File "C:\Users\Adrian\anaconda3\lib\site-packages\Bio\SeqRecord.py", line 803, in __eq__
  raise NotImplementedError(_NO_SEQRECORD_COMPARISON)

NotImplementedError: SeqRecord comparison is deliberately not implemented. Explicitly compare the 
attributes of interest.

Спасибо за любой ответ.

1 Ответ

0 голосов
/ 15 июля 2020

Объяснение

Вы не можете получить индекс и SeqRecord в списке, потому что «Сравнение SeqRecord намеренно не реализовано» (вы получили объяснение в сообщении об ошибке - NotImplementedError ). Метод index() возвращает самый низкий индекс в списке, в котором появляется obj. Но для этого необходим специальный метод сравнения c, который не реализован в модуле Seq.

Жесткий метод

Поскольку python является динамическим c языком, вы может добавить в класс метод сравнения. Даже сообщение об ошибке дает ответ ( Явно сравните интересующие атрибуты ). Вот код:

from Bio.SeqRecord import SeqRecord

def equal_seqs(self, other):
    if not isinstance(other, SeqRecord):
        raise NotImplementedError('Comparsion on wrong types!')
    else:
        return self.seq == other.seq # You can change it to whatever you want.

SeqRecord.__eq__ = equal_seqs

foo = SeqRecord('ATGCGCAT')
bar = SeqRecord('GACGATCA')

print(foo == bar)
# False

l = [foo, bar]
print(l.index(bar))
# 1

Другая возможность

Я не знаю, правильно ли я вас понял, но если вы хотите распечатать идентификатор последовательности, вы можете сделать это как следующее:

for seq in sequences:
    print(f'{seq.id} {seq.name}')

Это то, что вы хотели?

Подробнее

Если вы хотите узнать больше о богатых методах сравнения, вы можете найти его здесь

...