Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使for循环使用2个字符串?_Python_Python 2.7_Slice - Fatal编程技术网

Python 如何使for循环使用2个字符串?

Python 如何使for循环使用2个字符串?,python,python-2.7,slice,Python,Python 2.7,Slice,我有两个字符串要比较。问题是,我不知道如何同时迭代分割两个片段,然后在每个片段上运行比较代码。下面是我的代码,我尝试在for循环中使用for循环(每个字符串一个)来运行该代码,该循环没有出现任何错误,但只有第一个字符串被迭代分割并打印到屏幕上。第二次尝试是将2个for循环合并在一起,但是出现了错误消息,这清楚地解释了失败的原因,但是我不知道解决错误的方法 for循环中for循环的代码 for i in range(8, len(seq1)): seq1i = seq1[0:i]

我有两个字符串要比较。问题是,我不知道如何同时迭代分割两个片段,然后在每个片段上运行比较代码。下面是我的代码,我尝试在for循环中使用for循环(每个字符串一个)来运行该代码,该循环没有出现任何错误,但只有第一个字符串被迭代分割并打印到屏幕上。第二次尝试是将2个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)

我确信有一些使用高级切片和/或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)

尽管来自
os.path
模块,但您应该为此使用
os.path.commonprefix

>> s1 = 'GATTACA'
>> s2 = 'GATTCCC'
>> os.path.commonprefix([s1,s2])
'GATT'

打印中间结果有点低效,但这似乎有效:

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
在
空中交通管制
ATCG
ATCGA
ATCGAT
ATCGATC
ATCGATCG
ATCGATCGA
ATCGATCGAT
ATCGATCGATC
字符串共享长度为11的最长公共前缀

您实际上可以
zip
字符串,这似乎比这里的大多数答案更具python风格:

str1 = 'ACTGGAG'
str2 = 'ACTA'

prefix = ''
for a,b in zip(str1,str2):
    if a==b:
        prefix += a
    else:
        break

print prefix # prints ACT

你基本上想做什么?只要你记得写一个非常清晰的评论。。。谈论晦涩难懂的代码用法…我能理解为什么它看起来晦涩难懂,我同意在一些不是
os.path
的模块中有一个库函数是很好的,但是没有理由重新发明轮子来做普通前缀。除了它是一个非常简单的轮子,它的革新使你的代码更加清晰…@SilasRay我不知道我是否同意你的观点。使用stdlib中的方法,即使它被归类为
os.path
,并用于其他用途,也不会比编写一个新的自定义函数(您还必须为其编写文档)来拥有相同的函数更有意义。正如这个问题可能暗示的那样,有几种方法可以错误地重新发明轮子。虽然我同意这很烦人,而且肯定应该在其他地方(如果你在谷歌上搜索,你会发现人们非常恼火,因为它只做字符串操作,而不做更智能的路径检查,我个人只是在心里注意到,
os.path.commonprefix
实际上不是
os.path
的一部分)如果
seq1
seq2
长@martineau,可能会出现索引错误,这就是
如果
被包装在
try
中的原因。是否可以设置匹配异常,以便如果a或b='N'继续匹配?当然,只需将“a==b”更改为“a==b或a='N'或b='N'”如果您想要一些特殊的行为(比如在前缀中添加特殊字符),也可以添加另一个
str1 = 'ACTGGAG'
str2 = 'ACTA'

prefix = ''
for a,b in zip(str1,str2):
    if a==b:
        prefix += a
    else:
        break

print prefix # prints ACT