[英]How to use enumerate in a list comprehension with two lists?
我刚开始使用列表理解,我正在努力解决它。 在这种情况下,我需要获取每次迭代的每个列表( sequence_0
和sequence_1
)的n
个数。 我怎样才能做到这一点?
这个想法是在两个序列之间获得最长的相等核苷酸(基序)序列。 一旦找到一对,程序应该在序列的下一个核苷酸中继续,检查它们是否也相等,然后用它拉长基序。 最后的 output 应该是找到的所有基序的列表。 问题是,一旦找到一对,要在下一个核苷酸中继续,我需要两个序列中的 position 以继续程序。 index
function 在这种情况下不起作用,这就是我需要枚举的原因。
另外,我不完全理解()
之间的x
和y
的原因,理解这一点也很好:)
只是为了解释一下,列表的内容是 DNA 序列,所以它基本上是这样的:
sequence_1 = ['A', 'T', 'C', 'A', 'C']
def find_shared_motif(arq):
data = fastaread(arq)
seqs = [list(sequence) for sequence in data.values()]
motifs = [[]]
i = 0
sequence_0, sequence_1 = seqs[0], seqs[1] # just to simplify
for x, y in [(x, y) for x in zip(sequence_0[::], sequence_0[1::]) for y in zip(sequence_1[::], sequence_1[1::])]:
print(f'Pairs {"".join(x)} and {"".join(y)} being analyzed...')
if x == y:
print(f'Pairs {"".join(x)} and {"".join(y)} match!')
motifs[i].append(x[0]), motifs[i].append(x[1])
k = sequence_0.index(x[0]) + 2 # NAO ESTA DEVOLVENDO O NUMERO CERTO
u = sequence_1.index(y[0]) + 2
print(k, u)
# Determines if the rest of the sequence is compatible
print(f'Starting to elongate the motif {x}...')
for j, m in enumerate(sequence_1[u::]):
try:
# Checks if the nucleotide is equal for both of the sequences
print(f'Analyzing the pair {sequence_0[k + j]}, {m}')
if m == sequence_0[k + j]:
motifs[i].append(m)
print(f'The pair {sequence_0[k + j]}, {m} is equal!')
# Stop in the first nonequal residue
else:
print(f'The pair {sequence_0[k + j]}, {m} is not equal.')
break
except IndexError:
print('IndexError, end of the string')
else:
i += 1
motifs.append([])
return motifs
...
go 的一种方法是开始压缩两个列表:
a = ['A', 'T', 'C', 'A', 'C']
b = ['A', 'T', 'C', 'C', 'T']
c = zip(a,b)
在这种情况下, c
将具有以下值
c = [('A','A'), ('T','T'), ('C','C'), ('A','C'), ('C','T')]
然后,很明显,您想要的是将第一个元素与元组与第二个元素进行比较。 但是,您还需要 position 存在差异。 因此,您可以使用enumerate
go :
for i, t in enumerate(c):
if c[0] != c[1]:
return i
return -1
这样,如果最后得到-1
,则意味着两个列表中的所有元素都相等,并排。 否则,您将得到 position 的差异。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.