Python For цикл возврата Tuple - есть ли лучший способ сделать это - PullRequest
2 голосов
/ 18 января 2012

тестирование на точное совпадение ключевых строк в целевых строках.выходные данные должны быть кортежем начальных точек совпадений.Мой код работает, но я чувствую, что он может быть намного аккуратнее.Как я могу вернуть кортеж без конвертации из добавленного списка?искал везде и не могу найти ответ.Спасибо !!

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 голос
/ 18 января 2012
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.

1 голос
/ 18 января 2012

Это идеальная работа для регулярных выражений.

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 из последней строки и заставить вашу функцию возвращать более эффективный генератор.

0 голосов
/ 18 января 2012

Вот еще один способ сделать это:

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...