Python for循环返回元组——有没有更好的方法?

3 投票
3 回答
3778 浏览
提问于 2025-04-17 10:30

我在测试目标字符串中是否有完全匹配的关键字字符串。输出的结果必须是一个包含匹配开始位置的元组。我的代码可以运行,但我觉得它可以更简洁一些。我该如何在不将列表转换为元组的情况下直接返回一个元组呢?我到处搜索都找不到答案。谢谢!!

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 个回答

1

这里还有另一种方法:

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))
2
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

这个任务非常适合用正则表达式来解决。

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去掉,这样你的函数就会返回一个更高效的生成器。

撰写回答