Last active
February 5, 2018 03:49
-
-
Save toaco/e5e368c6622137e635af19d95b4469bb to your computer and use it in GitHub Desktop.
年阶梯气价计算方式
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# encoding=utf8 | |
from decimal import Decimal | |
def create_ladders(price_name, last_reading, current_reading, price): | |
""" 目前不考虑优惠,但是可以合计金额里面体现出来 | |
ladder['price_name'] = price_name | |
ladder['last_reading'] = last_reading | |
ladder['current_reading'] = current_reading | |
ladder['gas'] = current_reading - last_reading | |
ladder['price'] = price | |
ladder['amount'] = Decimal(current_reading - last_reading) * price | |
""" | |
ladders = [] | |
# 得到起数,止数和单价列表 | |
if price.count('|'): | |
code_array = filter(lambda x: x, price.split('|')) | |
price_array = zip(code_array[::2], code_array[1::2]) | |
price_array = [list(i) for i in price_array] | |
for item in price_array: | |
item[1] = int(item[1]) | |
assert len(price_array) > 0 | |
ok = False | |
for i, (price, gas) in enumerate(price_array): | |
if current_reading > gas > last_reading: | |
if i == 0 or price_array[i - 1][1] < last_reading: | |
ladders.append([price_name, last_reading, gas, gas - last_reading, price, | |
Decimal(gas - last_reading) * Decimal(price)]) | |
else: | |
ladders.append( | |
[price_name, price_array[i - 1][1], gas, gas - price_array[i - 1][1], | |
price, | |
Decimal(gas - price_array[i - 1][1]) * Decimal(price)]) | |
elif current_reading <= gas: | |
if i == 0: | |
ladders.append( | |
[price_name, last_reading, current_reading, | |
current_reading - last_reading, price, | |
Decimal(current_reading - last_reading) * Decimal(price)]) | |
else: | |
# 未测试 | |
if price_array[i - 1][1] > last_reading: | |
ladders.append( | |
[price_name, price_array[i - 1][1], current_reading, | |
current_reading - price_array[i - 1][1], price, | |
Decimal(current_reading - price_array[i - 1][1]) * Decimal(price)]) | |
else: | |
ladders.append( | |
[price_name, last_reading, current_reading, | |
current_reading - last_reading, price, | |
Decimal(current_reading - last_reading) * Decimal(price)]) | |
ok = True | |
break | |
# ok 处理 | |
if not ok: | |
if price_array[-1][1] > last_reading: | |
ladders.append( | |
[price_name, price_array[- 1][1], current_reading, | |
current_reading - price_array[- 1][1], code_array[-1], | |
Decimal(current_reading - price_array[- 1][1]) * Decimal(code_array[-1])]) | |
else: | |
ladders.append( | |
[price_name, last_reading, current_reading, | |
current_reading - last_reading, code_array[-1], | |
Decimal(current_reading - last_reading) * Decimal(code_array[-1])]) | |
else: | |
ladders.append( | |
[price_name, last_reading, current_reading, current_reading - last_reading, price, | |
Decimal(current_reading - last_reading) * Decimal(price)]) | |
return ladders | |
if __name__ == '__main__': | |
assert create_ladders('a', 100, 200, '2.5') == [['a', 100, 200, 100, '2.5', 250]] | |
# 2个阶梯 | |
assert create_ladders('a', 29, 59, '2.5|60|3.5') == [['a', 29, 59, 30, '2.5', 75]] | |
assert create_ladders('a', 30, 60, '2.5|60|3.5') == [['a', 30, 60, 30, '2.5', 75]] | |
# ok | |
assert create_ladders('a', 60, 70, '2.5|60|3.5') == [['a', 60, 70, 10, '3.5', 35]] | |
# ok | |
assert create_ladders('a', 61, 71, '2.5|60|3.5') == [['a', 61, 71, 10, '3.5', 35]] | |
# ok | |
assert create_ladders('a', 59, 61, '2.5|60|3.5') == [ | |
['a', 59, 60, 1, '2.5', Decimal('2.5')], | |
['a', 60, 61, 1, '3.5', Decimal('3.5')], | |
] | |
assert create_ladders('a', 58, 62, '2.5|60|3.5') == [ | |
['a', 58, 60, 2, '2.5', 5], | |
['a', 60, 62, 2, '3.5', 7], | |
] | |
## 3个阶梯,原样复制上面的代码,然后追加阶梯,之后仍然有一组测试不通过 | |
assert create_ladders('a', 29, 59, '2.5|60|3.5|80|4.5') == [['a', 29, 59, 30, '2.5', 75]] | |
assert create_ladders('a', 30, 60, '2.5|60|3.5|80|4.5') == [['a', 30, 60, 30, '2.5', 75]] | |
# 调整后改组失败,ok | |
assert create_ladders('a', 60, 70, '2.5|60|3.5|80|4.5') == [['a', 60, 70, 10, '3.5', 35]] | |
# ok,这是一组临界值 | |
assert create_ladders('a', 61, 71, '2.5|60|3.5|80|4.5') == [['a', 61, 71, 10, '3.5', 35]] | |
assert create_ladders('a', 59, 61, '2.5|60|3.5|80|4.5') == [ | |
['a', 59, 60, 1, '2.5', Decimal('2.5')], | |
['a', 60, 61, 1, '3.5', Decimal('3.5')], | |
] | |
assert create_ladders('a', 58, 62, '2.5|60|3.5|80|4.5') == [ | |
['a', 58, 60, 2, '2.5', 5], | |
['a', 60, 62, 2, '3.5', 7], | |
] | |
# 类似的补充,未发现问题 | |
assert create_ladders('a', 80, 90, '2.5|60|3.5|80|4.5') == [['a', 80, 90, 10, '4.5', 45]] | |
assert create_ladders('a', 81, 91, '2.5|60|3.5|80|4.5') == [['a', 81, 91, 10, '4.5', 45]] | |
assert create_ladders('a', 79, 81, '2.5|60|3.5|80|4.5') == [ | |
['a', 79, 80, 1, '3.5', Decimal('3.5')], | |
['a', 80, 81, 1, '4.5', Decimal('4.5')], | |
] | |
assert create_ladders('a', 78, 82, '2.5|60|3.5|80|4.5') == [ | |
['a', 78, 80, 2, '3.5', Decimal('7')], | |
['a', 80, 82, 2, '4.5', Decimal('9')], | |
] | |
# 跨两个阶梯,未发现问题 | |
assert create_ladders('a', 59, 81, '2.5|60|3.5|80|4.5') == [ | |
['a', 59, 60, 1, '2.5', Decimal('2.5')], | |
['a', 60, 80, 20, '3.5', Decimal('70')], | |
['a', 80, 81, 1, '4.5', Decimal('4.5')], | |
] | |
assert create_ladders('a', 58, 82, '2.5|60|3.5|80|4.5') == [ | |
['a', 58, 60, 2, '2.5', Decimal('5')], | |
['a', 60, 80, 20, '3.5', Decimal('70')], | |
['a', 80, 82, 2, '4.5', Decimal('9')], | |
] | |
# assert create_ladders('a', 1625, 1675, '1.90|390|2.28|630|2.85') == [ | |
# ['a', 1625, 1675, 2, '2.5', Decimal('5')], | |
# ] | |
# ooo | |
assert create_ladders('a', 0, 8, '1.90|390|2.28|630|2.85') == [ | |
['a', 0, 8, 8, '1.90', Decimal('1.90') * Decimal('8')], | |
] | |
print create_ladders('a', 1231, 1271, '1.90|390|2.28|630|2.85') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment