Разбор строки с разделителем в Python - PullRequest
0 голосов
/ 02 июня 2010

У меня есть строки данных, которые я хочу проанализировать. Данные выглядят так:

a score=216 expect=1.05e-06
a score=180 expect=0.0394

Что я хочу сделать, так это иметь подпрограмму которые анализируют их и возвращают 2 значения (оценка и ожидание) для каждая строка.

Однако эта моя функция, похоже, не работает:

def scoreEvalFromMaf(mafLines):
    for word in mafLines[0]:
        if word.startswith("score="):
            theScore = word.split('=')[1]
            theEval  = word.split('=')[2]
            return [theScore, theEval]
    raise Exception("encountered an alignment without a score")

Пожалуйста, посоветуйте, как правильно это сделать?

Ответы [ 3 ]

2 голосов
/ 02 июня 2010

Похоже, вы хотите разбить каждую строку на пробелы и проанализировать каждый фрагмент отдельно. Если mafLines является строкой (т. Е. Одна строка из .readlines():

def scoreEvalFromMafLine(mafLine):
    theScore, theEval = None, None
    for word in mafLine.split():
        if word.startswith("score="):
            theScore = word.split('=')[1]
        if word.startswith("expect="):
            theEval  = word.split('=')[1]

    if theScore is None or theEval is None:
        raise Exception("Invalid line: '%s'" % line)

    return (theScore, theEval)

То, как вы это делаете, будет перебирать каждый символ в первой строке (поскольку это список строк), а не в каждом пробеле.

2 голосов
/ 02 июня 2010

Если mafLines, если список строк, и вы хотите посмотреть только на первую, .split эта строка, чтобы получить слова. Например:

def scoreEvalFromMaf(mafLines):
    theScore = None
    theEval = None
    for word in mafLines[0].split:
        if word.startswith('score='):
            _, theScore = word.partition('=')
        elif word.startswith('expect='):
            _, theEval = word.partition('=')
    if theScore is None:
        raise Exception("encountered an alignment without a score")
    if theEVal is None:
        raise Exception("encountered an alignment without an eval")
    return theScore, theEval

Обратите внимание, что это вернет кортеж с двумя string элементами; например, если вы хотите использовать int и float, вам нужно изменить последнюю строку на

    return int(theScore), float(theEval)

и тогда вы получите исключение ValueError, если какая-либо строка недопустима для типа, который она должна представлять, и возвращенный кортеж с двумя числами, если обе строки верны.

1 голос
/ 02 июня 2010

Обязательное и, возможно, неуместное решение регулярного выражения:

import re
def scoreEvalFromMaf(mafLines):
    return [re.search(r'score=(.+) expect=(.+)', line).groups()
            for line in mafLines]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...