Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.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循环返回元组——有更好的方法吗_Python_String_For Loop_Tuples_Match - Fatal编程技术网

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>,因此它不是一个精确的副本。