Биективные отношения между диапазонами и некоторыми константами?
Пожалуйста, переместите этот вопрос в Code Review -area. Это лучше подходит, потому что я знаю, что приведенный ниже код является ненужным, и я хотел, чтобы критическая обратная связь была полностью переписана.
Как я могу написать отношения set-constants в 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 ответа
Решение
Если бы список был длиннее, чем три записи, я бы использовал 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
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)