Биективные отношения между диапазонами и некоторыми константами? - PullRequest
0 голосов
/ 25 января 2011

Пожалуйста, переместите этот вопрос в Code Review -area . Он лучше подходит для этого, потому что я знаю, что приведенный ниже код является ненужным, и я хотел, чтобы критическая обратная связь была полностью переписана.

Как я могу написать отношения набор-константа в Python? Так что если A в диапазоне, то вернуть соответствующую ему константу.

[0,10]    <-> a
]10,77]   <-> b
]77,\inf[ <-> c

Нюхательный код, плохо.

    # Bad style

    provSum=0


    # TRIAL 1: messy if-clauses
    for sold in getSelling():
            if (sold >=0 & sold <7700):
                    rate =0.1 
            else if (sold>=7700 & sold <7700):   
            #won't even correct mistakes here because it shows how not to do things
                    rate =0.15
            else if (sold>=7700):
                    rate =0.20


    # TRIAL 2: messy, broke it because it is getting too hard to read
    provisions= {"0|2000":0.1, "2000|7700":0.15, "7700|99999999999999":0.20}


    if int(sold) >= int(border.split("|")[0]) & int(sold) < int(border.split("|")[1]):
            print sold, rate
            provSum = provSum + sold*rate

Ответы [ 2 ]

3 голосов
/ 25 января 2011

Если бы список был длиннее, чем просто три записи, я бы использовал bisect.bisect():

limits = [0, 2000, 7700]
rates = [0.1, 0.15, 0.2]
index = bisect.bisect(limits, sold) - 1
if index >= 0:
    rate = rates[index]
else:
    # sold is negative

Но это выглядит немного переоцененным только для трех значений ...

Редактировать: Если подумать, самый читаемый вариант, вероятно, это

if sold >= 7700:
    rate = 0.2
elif sold >= 2000:
    rate = 0.15
elif sold >= 0:
    rate = 0.1
else:
    # sold is negative
1 голос
/ 25 января 2011
if (sold >=0 & sold <7700):

эквивалентно

if 0 <= sold < 7700:

Мне не известен действительно отличный способ для отображения диапазонов, но это делает его намного приятнее, по крайней мере.

Вы также можете использовать свой второй подход:

provisions = {(0, 2000) : 0.1, (2000,7700):0.15, (7700, float("inf")):0.20}

# loop though the items and find the first that's in range
for (lower, upper), rate in provisions.iteritems():
    if lower <= sold < upper:
        break # `rate` remains set after the loop ..

# which pretty similar (see comments) to
rate = next(rate for (lower, upper), rate in 
                 provisions.iteritems() if lower <= sold < upper)    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...