Python for循环返回元组——有没有更好的方法?
我在测试目标字符串中是否有完全匹配的关键字字符串。输出的结果必须是一个包含匹配开始位置的元组。我的代码可以运行,但我觉得它可以更简洁一些。我该如何在不将列表转换为元组的情况下直接返回一个元组呢?我到处搜索都找不到答案。谢谢!!
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))
顺便说一下,不要用像 target1
、key11
这样的名字,应该用 targets
、keys
这样的列表名。
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
去掉,这样你的函数就会返回一个更高效的生成器。