Search code examples
pythonsetbijection

Bijective relations between ranges and some constants?


Please, move this question to Code Review -area. It is better suited there because I know the code below is junk and I wanted critical feedback to complete rewrite.

How can I write the set-to-constants relations in Python? So if A in a range, then return its corresponding constant.

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

Smelling code, bad.

    # 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

Solution

  • If the list was longer than a mere three entries, I would use 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
    

    But this seems a bit overengineered for just three values...

    Edit: On second thought, the most readable variant probably is

    if sold >= 7700:
        rate = 0.2
    elif sold >= 2000:
        rate = 0.15
    elif sold >= 0:
        rate = 0.1
    else:
        # sold is negative