Повышение эффективности строкового фильтра - PullRequest
0 голосов
/ 02 января 2019

У меня длинный текстовый файл, содержащий несколько строк. Вот часть файла:

tyh89= 13
kb2= 0
78%= yes
##@bb1= 7634.0
iih54= 121
fgddd= no
#aa1= 0
#aa2= 1
#$ac3= 0
yt#@hh= 0
#j= 12.1
##hf= no

Итак, в основном все элементы имеют общую структуру: header= value. Моя цель - искать элементы, заголовки которых содержат определенные строковые части, и считывать значения этих элементов.

В тот момент, когда я делаю это с довольно прямым подходом: открываем / читаем весь файл как строку, дифференцируем его в список элементов и запускаем условия if / elif для всех элементов, используя цикл for. Я предоставляю свой код ниже.

Это самый эффективный способ сделать это? Или есть более эффективный способ сделать это без реализации цикла?

def main():
    print(list(import_param()))

def import_param():
    fl = open('filename','r')
    cn = fl.read()
    cn = cn.split('\n')
    fl.close()
    for st in cn:
        if 'fgddd' in st:
            el = st.split(' ')
            yield float(el[1])
        elif '#j' in st:
            el = st.split(' ')
            yield float(el[1])    

if __name__ == '__main__': main()

1 Ответ

0 голосов
/ 02 января 2019

да, есть.Вы должны избегать проверки, если строка содержит строку, а сосредоточиться на строке равенство .

Как только вы согласитесь на равенство, это означает, что вы можете создать набор с известными ключевыми словами, разделитьв соответствии с = и проверьте, содержит ли набор ваше значение (используя O(1) lookup):

key_set = {"fgddd","#j"}

for st in cn:
    if '=' in st:
       key,value = st.split("=",1)
       if key in key_set:
           el = value.strip()
           yield float(el)

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

key_set = {"fgddd":float ,"#j": float, "whatever":int , "something":str}

for st in cn:
    if '=' in st:
       key,value = st.split("=",1)
       if key in key_set:
           el = value.strip()
           yield key_set[key](el)  # apply type conversion

обратите внимание, что если вам не нужно преобразование, str выполнит работу так, как она вернет себя, когда передаст строку.

последнее примечание: если у вас есть право голосаФормат ввода, предложите использовать json вместо пользовательского формата.Разбор становится тривиальным с использованием модуля json, и фильтрация может быть достигнута так же, как я показал.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...