My current if-else block looks like this -
def do_something(value):
if value <= 0:
return 1
elif value > 0 and value < 5:
return 2
else:
return 3
Please note that the example is not a direct representation of my code. I have significantly reduced the number of if-else blocks for the sake of brevity. What I would like to do is create a dictionary that can hold the threshold values for each condition as a key. Here's an example of what i mean by this.
dict_factory_pattern = {
0: 1,
1-4: 2,
5-inf: 3
}
# With the dictionary structure above I want to refactor my do_something () to as shown below
def do_something(value):
return dict_factory_pattern[value]
Is this possible?
CodePudding user response:
To reduce the amount of code, you could declare the threshold values in a dict and iterate over them. This is essentially the same as having multiple if
statements, except you don't have to spell them out yourself. You do however loose the flexibility of multiple conditions since the same comparison (e.g. less than or equal) is applied to all threshold values. The compactness of the rule set may be worth it.
thresholds = {
0: 1,
5: 2,
float('inf'): 3,
}
def find_value(n):
for threshold, result in thresholds.items():
if n <= threshold:
return result
[find_value(n) for n in [-0.5, 0, 0.5, 10]] # gives [1, 1, 2, 3]
CodePudding user response:
You could use an interval tree. Note that its boundary values are such that the lower bound is included but the upper bound is not.
# pip install intervaltree
from intervaltree import IntervalTree
tree = IntervalTree()
tree[float('-inf'):0] = 1
tree[0:5] = 2
tree[5:float('inf')] = 3
def find_value(n):
interval = tree[n]
if interval:
result = sorted(interval)[0]
return result.data
[find_value(n) for n in [-0.5, 0, 0.5, 10]] # gives [1, 2, 2, 3]
CodePudding user response:
Dictionary cannot do such thing. The selection alone can be done by a conditional. Assume your input is value
value = int(input("input value"))
res = 1 if value <= 0 else 2 if 1 <= value <= 4 else 5
I notice it's a factory pattern you are concerning. So for example you have three Object you want to create (build) then do
class FrogWorld:
pass
class Wizard:
pass
class StreetFighter:
pass
value = int(input("input value"))
res = FrogWorld if value <= 0 else Wizard if 1 <= value <= 4 else StreetFighter
res will be the made now. This is just a short answer. It can be more elaborate expression for this