Как я могу написать это лучше в Python? - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь написать функцию, в которой у меня есть LP данных и на основе значения LP будет какой-то вывод.

def data(lp,matrix):
    if (lp<20):
        T52 = lp*matrix.t1[0] + matrix.t2[0]            
        return T52

    elif (lp>=20) and (lp<30):
        T52 = lp*matrix.t1[1] + matrix.t2[2]
        return T52

    elif (lp>=30) and (lp<50):
        T52 = lp*matrix.t1[3] + matrix.t2[3]
        return T52

    elif (lp>=50) and (lp<65):
        T52 = lp*matrix.t1[4] + matrix.t2[4]
        return T52

    elif (lp>=65) and (lp<80):
        T52 = lp*matrix.t1[5] + matrix.t2[5]
        return T52

    elif (lp>=80):
        T52 = lp*matrix.t1[6] + matrix.t2[6]
        return T52

Ответы [ 3 ]

2 голосов
/ 27 июня 2019

Если вам действительно нужна зацикленная версия, это требует некоторой утонченности из-за несовместимых индексов:

def data(lp,matrix):
    splits = [20, 30, 40, 65, 80]
    indices = [(0,0), (1,2), (3,3), (4,4), (5,5), (6,6)]
    for split, (id1, id2) in zip(splits, indices):
        if lp < split:
            return lp*matrix.t1[id1] + matrix.t2[id2]
    return lp*matrix.t1[indices[-1][0]] + matrix.t2[indices[-1][1]]

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

def data(lp,matrix):
    if lp<20:
        return lp*matrix.t1[0] + matrix.t2[0]

    elif lp<30:
        return lp*matrix.t1[1] + matrix.t2[2]

    elif lp<50:
        return lp*matrix.t1[3] + matrix.t2[3]

    elif lp<65:
        return lp*matrix.t1[4] + matrix.t2[4]

    elif lp<80:
        return lp*matrix.t1[5] + matrix.t2[5]

    else:
        return lp*matrix.t1[6] + matrix.t2[6]
1 голос
/ 27 июня 2019

Почему бы вам не поставить все в цикл? кажется мне намного чище.

bounds = [20,30,50,65,80]
n = len(bounds)
for i, bound in enumerate(bounds):
    if lp < bound:
        return lp*matrix.t1[i] + matrix.t2[i]
return lp * matrix.t1[n] + matrix.t2[n]

Edit: Так что я был немного слеп, не видя, что индексы не были связаны с циклом. Вы все еще можете выбрать такое решение, просто ведя список индексов

bounds = [20,30,50,65,80]
idxs = [(0,0), (1,2), (3,3), (4,4), (5,5), (6,6)]
for i,bound in enumerate(bounds):
    if lp<bound:
        return lp*matrix.t1[idxs[i][0]] + matrix.t2[idxs[i][1]]
return lp*matrix.t1[idxs[-1][0]] + matrix.t2[idxs[-1][1]]

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

0 голосов
/ 05 июля 2019

Вы можете использовать bisect с дополнительным преимуществом более эффективной логики сравнения:

from bisect import bisect_left
def data(lp,matrix):
    control = [     20,    30,    50,    65,    80     ]
    indexes = [(0,0), (1,2), (3,3), (4,4), (5,5), (6,6)]
    c       = bisect_left(lp,control)
    i,j     = indexes[c]
    return lp*matrix.t1[i] + matrix.t2[j]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...