Собирая информацию из комментариев, я думаю, что вам нужно следующее: учитывая список мотивов (в вашем случае, нуклеотидные строки каждые 50 базисных длин), вы хотите получить подпоследовательности (k-мерс) длины kкоторые появляются в каждом.Более питонский способ написания вашего кода:
bases = ['A', 'T', 'C', 'G']
self.profile = []
k = self.ksize
kmer = [''.join(p) for p in itertools.product(bases, repeat=k)]
for mot in self.motifs:
for km in kmer:
if km in mot:
self.kmers.append(km)
self.profile.append(self.kmers)
Обратите внимание, что в python вам не нужно циклически перебирать индексы, если вы собираетесь использовать его только для доступа к спискам, массивам или любым другимитерация;Вы можете просто перебрать итерацию самой.Проверьте zip
и enumerate
для большей гибкости.
И последнее: обратите внимание, что self.kmer
будет списком, связывающим [kmer1, kmer2, kmer4, kmer6]
и т. Д. (Т. Е. Kmers in yor мотив), но выне сможет различить мотивы.Также self.profile
будет списком, содержащим [[kmer1], [kmer1, kmer2], [kmer1, kmer2, kmer4]]
и т. Д.
Если вас не волнует self.profile
(потому что вы можете построить его позже), вы можете делать все с пониманием большого списка:
kmers = [km for mot in motifs for km in kmer if km in mot]
РЕДАКТИРОВАТЬ: две дополнительные вещи
Обратите внимание, что таким образом, kmers
будет иметь повторяющиеся последовательности.Чтобы избежать этого, вы можете либо написать дополнительную проверку (if km not in self.kmers
), либо использовать sets , чтобы избежать повторения.
Если вы do хотите получить списокKmers разделены мотивами, вы можете сделать это проще с пониманием списка:
self.profile = []
for mot in motifs:
individual_km = [km for km in kmer if km in mot]
self.profile.append(individual_km)