我想要比较两个字符串。问题是我不知道如何同时迭代地切片,然后在每个slice上运行比较代码。下面是我试图通过在for循环中使用for循环来运行的代码(每个字符串一个) )没有出现任何错误,但只有第一个字符串被迭代切片并打印到屏幕上。第二次尝试是将2 for循环合并在一起但是提供的错误消息出现了,这解释了它失败的原因,但是我不知道围绕错误的方法。
for循环for for循环的代码
for i in range(8, len(seq1)):
seq1i = seq1[0:i]
print seq1i
for i in range(8,len(seq2)):
seq2i = seq2[0:i]
print seq2i
for c1, c2 in zip(seq1i, seq2i):
if c1 == c2:
counter += 1
else:
break
print "String share the longest common prefix of length %d: %s" % (counter, seq1[:counter])
if counter >= 8:
print " Match found, match length %d" % counter
尝试合并for循环:
for i1,i2 in range(8,len(seq1, seq2)):
for c1, c2 in zip(seq1i, seq2i):
if c1 == c2:
counter += 1
else:
break
print "String share the longest common prefix of length %d: %s" % (counter, seq1[:counter])
if counter >= 8:
print " Match found, match length %d" % counter
这导致了错误:
TypeError Traceback (most recent call last)
<ipython-input-26-9c4822069792> in <module>()
----> 1 for i1,i2 in range(8,len(seq1, seq2)):
2 for c1, c2 in zip(seq1i, seq2i):
3 if c1 == c2:
4 counter += 1
5 else:
TypeError: len() takes exactly one argument (2 given)
我认为必须有一种方法,每个字符串的迭代切片都会发生,并且当它们生成时,可以运行匹配(如果c1 == c2)代码。
想要的输出是:
如果seq1和seq2:
seq1 = 'ATCGATCGATCGAAAA'
seq2 = 'ATCGATCGATCCCCCC'
A
A
AT
AT
ATC
ATC
ATCG
ATCG
ATCGA
ATCGA
ATCGAT
ATCGAT
ATCGATC
ATCGATC
ATCGATCG
ATCGATCG
ATCGATCGA
ATCGATCGA
ATCGATCGAT
ATCGATCGAT
ATCGATCGATC
ATCGATCGATC
String share the longest common prefix of length 10:ATCGATCGATC
答案 0 :(得分:4)
我确信使用高级切片和/或itertools有更好的解决方案,但老实说,我认为简单的循环是最简单的方法。
for i, c in enumerate(seq1):
try:
if c != seq2[i]:
break
print seq1[:i + 1] + '\n' + seq1[:i + 1]
except IndexError:
break
print 'Longest common prefix %s of length %d' % (seq1[:i], i)
答案 1 :(得分:4)
尽管来自os.path
模块,但您应该使用os.path.commonprefix
。
>> s1 = 'GATTACA'
>> s2 = 'GATTCCC'
>> os.path.commonprefix([s1,s2])
'GATT'
答案 2 :(得分:2)
你实际上可以zip
字符串,这似乎比大多数答案更加pythonic:
str1 = 'ACTGGAG'
str2 = 'ACTA'
prefix = ''
for a,b in zip(str1,str2):
if a==b:
prefix += a
else:
break
print prefix # prints ACT
答案 3 :(得分:0)
打印中间结果效率有点低,但这似乎有效:
def lcp(seq1, seq2):
ret = []
for i in xrange(min(len(seq1), len(seq1))):
if seq1[i] != seq2[i]:
break
else:
ret.append(seq1[i])
print ''.join(ret)
print "strings share a longest common prefix of length:", len(ret)
seq1 = 'ATCGATCGATCGAAAA'
seq2 = 'ATCGATCGATCCCCCC'
lcp(seq1, seq2)
输出:
A
AT
ATC
ATCG
ATCGA
ATCGAT
ATCGATC
ATCGATCG
ATCGATCGA
ATCGATCGAT
ATCGATCGATC
strings share a longest common prefix of length: 11