Python For循环返回元组——有更好的方法吗
测试目标字符串中键字符串的精确匹配。输出必须是匹配起始点的元组。我的代码可以工作,但我觉得它可以更整洁。如果不从附加列表转换,如何返回元组?到处找,似乎找不到答案。谢谢Python For循环返回元组——有更好的方法吗,python,string,for-loop,tuples,match,Python,String,For Loop,Tuples,Match,测试目标字符串中键字符串的精确匹配。输出必须是匹配起始点的元组。我的代码可以工作,但我觉得它可以更整洁。如果不从附加列表转换,如何返回元组?到处找,似乎找不到答案。谢谢 from string import * target1 = 'atgacatgcacaagtatgcat' target2 = 'atgaatgcatggatgtaaatgcag' key10 = 'a' key11 = 'atg' key12 = 'atgc' key13 = 'atgca' def subStrin
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)
这是正则表达式的完美工作
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))
当然,除非您确实需要结果是一个元组,否则您可以从最后一行删除元组
,让函数返回一个更高效的生成器
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
之类的名称,而是使用目标
,键
列表。这里有另一种方法:
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))
元组是不可变的,因此,如果要动态创建元组,它必须是一个列表。不确定为什么您认为代码“不整洁”,因为您必须转换为元组?可能重复:我不介意向下投票,但我很好奇为什么会这样。有什么解释吗?这可能是一个意外,或者因为有人认为这个问题是重复的(这个问题也被错误地否决了(重复的应该被关闭,而不是被否决))。我遇到过所有答案都被否决的情况(尽管在本例中并非如此)。我考虑的问题是如何在不创建中间列表的情况下获得<代码> tuple < /Cord>,因此它不是一个精确的副本。