@MazAlVlad

Можно ли сократить код?

Имеем
входные данные: последовательности a,b,c
имеем последовательность значений VALUE
к этим последовательностям применяется функция any_func
Смысл за один перебор последовательности VALUE обработать данные,
сам по себе VALUE по факту бесконечен и его прекращает if (End_a[0]==True and...
def any_func (End,Value,X,Count):
    Count=Count+1
    if Value>X:
        End=True
    return End,Count

def My_Code(a,b,c):

    #End flags
    End_a=[False,False,False,False,False]
    End_b=[False,False,False,False,False]
    End_c=[False,False,False,False,False]
    #End_d=...
    #End_e=...
    #...

    #Count result,output data
    Count_a=[0,0,0,0,0]
    Count_b=[0,0,0,0,0]
    Count_c=[0,0,0,0,0]
    #Count_d=...
    #Count_e=...
    #...

    #VALUE - any data to calculation
    for VALUE in range(100):            
        
        #indexes
        for j in range(5):              
            if End_a[j]==False:
                End_a[j],Count_a[j]=any_func(End_a[j],VALUE,a[j],Count_a[j])
            if End_b[j]==False:
                End_b[j],Count_b[j]=any_func(End_b[j],VALUE,b[j],Count_b[j])
            if End_c[j]==False:
                End_c[j],Count_c[j]=any_func(End_c[j],VALUE,c[j],Count_c[j])
            #if End_d==
                #...
            #if End_e==
                #...
            #...
               
        #stop data if All End = True
        if (End_a[0]==True and End_a[1]==True and End_a[2]==True and End_a[3]==True and End_a[4]==True and
            End_b[0]==True and End_b[1]==True and End_b[2]==True and End_b[3]==True and End_b[4]==True and
            End_c[0]==True and End_c[1]==True and End_c[2]==True and End_c[3]==True and End_c[4]==True):
            break
        
            
    return Count_a,Count_b,Count_c

if __name__=='__main__':
    
    #input data
    a=[1,2,3,4,5]
    b=[2,4,8,10,12]
    c=[7,6,5,4,3]
    #d=...
    #e=...
    #...
    
    Count_a,Count_b,Count_c = My_Code(a,b,c)
    #result
    print(Count_a,Count_b,Count_c)

Можно ли сократить код или упростить, чувствую начали появляться d,e,f и ...
  • Вопрос задан
  • 133 просмотра
Пригласить эксперта
Ответы на вопрос 4
для начала ==True или ==False излишние проверки
потом есть функции any и all которыми можно заменить проверку if (End_a[0]==True ...
#End flags
    End_a=
- все это можно заменить на словарь листов или совсем убрать этот список, а просто считать количество обработок, и сравнивать их с длиной списка.
Также можно заменить списки count_a...

И в целом кажется не нужен тут двойной цикл.
Вы бы лучше нормально задание написали, что за чем и почем надо сделать
Ответ написан
@Art005
for j in range(5):              
            if End_a[j]:
                End_a[j],Count_a[j]=any_func(End_a[j],VALUE,a[j],Count_a[j])
if End_a[0] and End_a[1]...

Как минимум это
Ответ написан
Комментировать
@o5a
Не до конца понятна необходимость таких манипуляций. Если это для того, чтобы как-бы 1 раз пройти по VALUES, то по факту это же просто переставляет местами 2 перебора.
перебор по VALUES:
    перебор по всем параметрам:

вместо
перебор по по всем параметрам:
    перебор VALUES:


Насколько я вижу, эта функция просто высчитывает некий порог срабатывания для каждого параметра. Тогда эти функции можно переписать так:
def threshold (values, x):
    for i, val in enumerate(values, 1):
        if val > x:
            return i
    return None

def My_Code(a,b,c):

    #VALUE - any data to calculation
    VALUES = list(range(100))

    Count_a = [threshold(VALUES, x) for x in a]
    Count_b = [threshold(VALUES, x) for x in b]
    Count_c = [threshold(VALUES, x) for x in c]

    return Count_a,Count_b,Count_c

if __name__=='__main__':

    #input data
    a=[1,2,3,4,5]
    b=[2,4,8,10,12]
    c=[7,6,5,4,3]
    #d=...
    #e=...
    #...

    Count_a,Count_b,Count_c = My_Code(a,b,c)
    #result
    print(Count_a,Count_b,Count_c)

# [3, 4, 5, 6, 7] [4, 6, 10, 12, 14] [9, 8, 7, 6, 5]

Не стал менять структуру возвращаемого Counter_a, ..., но вообще это тоже можно объединить во вложенный список, чтобы не было этих отдельных a, b, c, Counter_a, Counter_b, Counter_c, но это уже как удобнее.

В целом если нужно повысить производительность, то лучше посмотреть в сторону numpy, тем более тут чисто работа с массивами чисел.
Ответ написан
adugin
@adugin Куратор тега Python
В код не вникал, но, похоже, вам очень пригодятся эти функции модуля itertools:
from itertools import takewhile, dropwhile, compress
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы