Python For循环返回Tuple - 有更好的方法来做到这一点

时间:2012-01-18 08:09:27

标签: python string for-loop tuples match

测试目标字符串中键字符串的精确匹配。输出必须是匹配起始点的元组。我的代码有效,但我觉得它可以更整洁。如何在不转换附加列表的情况下返回元组?到处搜索,似乎无法找到答案。谢谢!

from string import *


target1 = 'atgacatgcacaagtatgcat'
target2 = 'atgaatgcatggatgtaaatgcag'

key10 = 'a'
key11 = 'atg'
key12 = 'atgc'
key13 = 'atgca'

def subStringMatchExact(target, key):
    match_list = []
    location = 0

    for i in target:
        ans = find(target, key, location)
        if ans >= 0:
            match_list.append(ans)
            location = ans + (len(key))

    print tuple(match_list)

subStringMatchExact(target1, key11)

3 个答案:

答案 0 :(得分:1)

这是正则表达式的完美工作。

import re
def subStringMatchExact(target, key):
    regex = re.compile(re.escape(key))
    return tuple(match.start() for match in regex.finditer(target))

请注意,这仅查找非重叠匹配。如果你想找到重叠的匹配项:

def subStringMatchExact(target, key):
    regex = re.compile("(?=" + re.escape(key) + ")")
    return tuple(match.start() for match in regex.finditer(target))

当然,除非您确实需要将结果作为元组,否则您可以从最后一行中删除tuple并让函数返回更高效的生成器。

答案 1 :(得分:1)

def subStringMatchExact(target, key):
    i = target.find(key)
    while i != -1:
        yield i
        i = target.find(key, i + len(key))

print tuple(subStringMatchExact(target1, key11))

顺便说一句,请勿使用target1key11使用targetskeys列表等名称。

答案 2 :(得分:0)

这是另一种方法:

def find_sublist(l, sublist):
    for i in xrange(len(l)-len(sublist)+1):
        if sublist == l[i:i+len(sublist)]:
            yield i

然后你可以做这样的事情来获得你的元组:

tuple(find_sublist(target1, key11))