Уведомления

Группа в Telegram: @pythonsu

#1 Июнь 7, 2019 06:35:12

KsenZ
Зарегистрирован: 2016-11-07
Сообщения: 11
Репутация: +  1  -
Профиль   Отправить e-mail  

Как сделать код лучше

Собственно есть задача, на основе данных из одного файла, создать другой файл.
Содержание исходного файла:

5125002 | + | | | + | | | + | | | + | | | | | | | | | | | | | | | АК | Ктг. 5
5125003 | + | | + | + | | | + | | | + | | | | | | | | | | | | | | | АК | Ктг. 2
На выходе нужно получить, такое:
5125002 VK=1 PI=0 IM=0 IG=1 45=0 43=0 17=1 18=0 19=0 21=1 22=0 23=0 24=0 25=0 26=0 27=0 31=0 29=0 32=0 34=0 36=0 55=0 56=0 KS=0 AK KT=5;
5125003 VK=1 PI=0 IM=1 IG=1 45=0 43=0 17=1 18=0 19=0 21=1 22=0 23=0 24=0 25=0 26=0 27=0 31=0 29=0 32=0 34=0 36=0 55=0 56=0 KS=0 AK KT=2;
Т.е. разделители ‘|’, между ними, в исходном файле, ‘+’ или пусто, так же есть несколько тестовых значений.
Выходной файл, содержит код “статуса” (VK, IM, 22 и т.д.), и значение. Если в исходном фале был “+”, то значение выставляется в “1”, если было пусто, то “0”.

Задачу я решил, при помощи кучи if else.
Собственно у меня вопрос, а можно ли как то сделать это более компактно и красиво?
Вот мой код:
 import csv
import os
if os.path.exists('status.abn'):
    os.remove('status.abn')
with open('status.txt') as f:
    reader = csv.reader(f, delimiter='|')
    for line in reader:
        data = [line[0][:-1]]
        if line[1] == ' +  ':
            data.append('VK=1')
        else:
            data.append('VK=0')
        if line[2] == ' +  ':
            data.append('PI=1')
        else:
            data.append('PI=0')
        if line[3] == ' +  ':
            data.append('IM=1')
        else:
            data.append('IM=0')
        if line[4] == ' +  ':
            data.append('IG=1')
        else:
            data.append('IG=0')
        if line[5] == ' +  ':
            data.append('45=1')
        else:
            data.append('45=0')
        if line[6] == ' +  ':
            data.append('43=1')
        else:
            data.append('43=0')
        if line[7] == ' +  ':
            data.append('17=1')
        else:
            data.append('17=0')
        if line[8] == ' +  ':
            data.append('18=1')
        else:
            data.append('18=0')
        if line[9] == ' +  ':
            data.append('19=1')
        else:
            data.append('19=0')
        if line[10] == ' +  ':
            data.append('21=1')
        else:
            data.append('21=0')
        if line[11] == ' +  ':
            data.append('22=1')
        else:
            data.append('22=0')
        if line[12] == ' +  ':
            data.append('23=1')
        else:
            data.append('23=0')
        if line[13] == ' +  ':
            data.append('24=1')
        else:
            data.append('24=0')
        if line[14] == ' +  ':
            data.append('25=1')
        else:
            data.append('25=0')
        if line[15] == ' +  ':
            data.append('26=1')
        else:
            data.append('26=0')
        if line[15] == ' +  ':
            data.append('27=1')
        else:
            data.append('27=0')
        if line[16] == ' +  ':
            data.append('31=1')
        else:
            data.append('31=0')
        if line[17] == ' +  ':
            data.append('29=1')
        else:
            data.append('29=0')
        if line[18] == ' +  ':
            data.append('32=1')
        else:
            data.append('32=0')
        if line[19] == ' +  ':
            data.append('34=1')
        else:
            data.append('34=0')
        if line[20] == ' +  ':
            data.append('36=1')
        else:
            data.append('36=0')
        if line[21] == ' +  ':
            data.append('55=1')
        else:
            data.append('55=0')
        if line[22] == ' +  ':
            data.append('56=1')
        else:
            data.append('56=0')
        if line[23] == ' +  ':
            data.append('KS=1')
        else:
            data.append('KS=0')
        if line[24] == ' АК  ':
            data.append('AK')
        else:
            data.append('AK')
        if line[26] == ' Ктг. 1':
            data.append('KT=1')
        elif line[26] == ' Ктг. 2':
            data.append('KT=2')
        elif line[26] == ' Ктг. 3':
            data.append('KT=3')
        elif line[26] == ' Ктг. 4':
            data.append('KT=4')
        elif line[26] == ' Ктг. 5':
            data.append('KT=5')
        f2 = open('status.abn', 'a')
        f2.write(' '.join(map(str, data))+';\n')
    f2.close()

Офлайн

#2 Июнь 7, 2019 08:11:47

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10026
Репутация: +  857  -
Профиль   Отправить e-mail  

Как сделать код лучше

  
>>> lst = [(' + ', 'VK=1', 'VK=0'),
...        (' + ', 'PI=1', 'PI=0'),
...        (' + ', 'IM=1', 'IM=0'),
...        (' + ', 'IG=1', 'IG=0')]
>>> 
>>> parts = [' + ', ' x ', ' + ', ' y ']
>>> 
>>> out = []
>>> for i in range(len(parts)):
...     if parts[i] == lst[i][0]:
...         out.append(lst[i][1])
...     else:
...         out.append(lst[i][2])
... 
>>> out
['VK=1', 'PI=0', 'IM=1', 'IG=0']
>>>

  
>>> lst = [(' + ', 'VK=1', 'VK=0'),
...        (' + ', 'PI=1', 'PI=0'),
...        (' + ', 'IM=1', 'IM=0'),
...        (' + ', 'IG=1', 'IG=0')]
>>> 
>>> parts = [' + ', ' x ', ' + ', ' y ']
>>> 
>>> out = []
>>> for i, j in zip(parts, lst):
...     if i == j[0]:
...         out.append(j[1])
...     else:
...         out.append(j[2])
... 
>>> out
['VK=1', 'PI=0', 'IM=1', 'IG=0']
>>> 

  
>>> lst = [(' + ', 'VK=1', 'VK=0'),
...        (' + ', 'PI=1', 'PI=0'),
...        (' + ', 'IM=1', 'IM=0'),
...        (' + ', 'IG=1', 'IG=0')]
>>> 
>>> parts = [' + ', ' x ', ' + ', ' y ']
>>> 
>>> out = []
>>> for i, j in zip(parts, lst):
...     out.append(j[1] if i == j[0] else j[2])
... 
>>> out
['VK=1', 'PI=0', 'IM=1', 'IG=0']
>>> 



Отредактировано py.user.next (Июнь 7, 2019 08:17:48)

Офлайн

#3 Июнь 7, 2019 11:02:52

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Как сделать код лучше

 >>> s1 = "5125002 | + | | | + | | | + | | | + | | | | | | | | | | | | | | | АК | Ктг. 5"
>>> s2 = ("VK", "PI", "IM", "IG", "45", "43", "17", "18", "19", "21", "22", "23", "24", "25", "26", "27", "31", "29", "32", "34", "36", "55", "56", "KS")
>>> " ".join(map(lambda x1, x2: x1+'='+x2, s2, [ '1' if x.strip() else '0' for x in s1.split('|')[1:-2]]))
'VK=1 PI=0 IM=0 IG=1 45=0 43=0 17=1 18=0 19=0 21=1 22=0 23=0 24=0 25=0 26=0 27=0 31=0 29=0 32=0 34=0 36=0 55=0 56=0 KS=0'



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Июнь 7, 2019 11:07:55)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version