Python Forum
Help for simplifying code - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: Help for simplifying code (/thread-21212.html)



Help for simplifying code - mmk1995 - Sep-19-2019

Hello,
How can I simplify below two coding to make the code clean?
coding 1:
Case1,Case2,Case3,Case4,Case5=0,0,0,0,0,0
if rule = 1:
    Case1+=1
elif rule = 2:
    Case2+=1
elif rule = 3:
    Case3+=1
elif rule = 4:
    Case4+=1
elif rule = 5:
    Case5+=1
coding 2:
if condition:
    break
elif condition:
    x,y,z = none,none,none
    a,b,c = 1,2,3
else:
    x,y,z = 10,11,12
    a,b,c = 1,2,3
Thanks!


RE: Help for simplifying code - metulburr - Sep-19-2019

the first code section can be converted to a dictionary


RE: Help for simplifying code - perfringo - Sep-19-2019

It seems to be counting so defaultdict could be an option:

>>> from collections import defaultdict
>>> c = defaultdict(int)
>>> rules = [1, 2, 3, 4, 2, 3, 5, 4]
>>> for rule in rules:
...     c[rule] += 1
...
>>> c
defaultdict(int, {1: 1, 2: 2, 3: 2, 4: 2, 5: 1})
>>> c[3]
2
Or Counter:

>>> from collections import Counter
>>> c = Counter(rules)
>>> c
Counter({1: 1, 2: 2, 3: 2, 4: 2, 5: 1})
>>> c[5] += 1
>>> c[5]
2
EDIT: regarding 2 code: elif will be never executed therefore redundant. First if catches all True conditions and there is nothing left for elif not to mention that somewhere must be loop from which to break out (not provided in code sample).


RE: Help for simplifying code - mmk1995 - Sep-20-2019

(Sep-19-2019, 12:02 PM)perfringo Wrote: It seems to be counting so defaultdict could be an option:

>>> from collections import defaultdict
>>> c = defaultdict(int)
>>> rules = [1, 2, 3, 4, 2, 3, 5, 4]
>>> for rule in rules:
...     c[rule] += 1
...
>>> c
defaultdict(int, {1: 1, 2: 2, 3: 2, 4: 2, 5: 1})
>>> c[3]
2
Or Counter:

>>> from collections import Counter
>>> c = Counter(rules)
>>> c
Counter({1: 1, 2: 2, 3: 2, 4: 2, 5: 1})
>>> c[5] += 1
>>> c[5]
2
EDIT: regarding 2 code: elif will be never executed therefore redundant. First if catches all True conditions and there is nothing left for elif not to mention that somewhere must be loop from which to break out (not provided in code sample).

Thanks for your answer,
for code 2, I wish I can actually simplify without the break like:
if condition:
    x,y,z = none,none,none
    a,b,c = 1,2,3
else:
    x,y,z = 10,11,12
    a,b,c = 1,2,3



RE: Help for simplifying code - perfringo - Sep-20-2019

With code above you will get NameError (if you haven't somewhere in your code defined none, which would be bad practice).

a, b, c are the same in both cases, so no need to write those two times or put into conditionals. If you like 'clever' one-liners then you can do following regarding x, y, z:

>>> condition = ''
>>> x, y, z = ([x, None][bool(condition)] for x in range(10, 13))
>>> x, y, z
(10, 11, 12)
>>> condition = 'abc'
>>> x, y, z = ([x, None][bool(condition)] for x in range(10, 13))
>>> x, y, z
(None, None, None)



RE: Help for simplifying code - wavic - Sep-20-2019

In your initial code all the if conditions are with a = sing which is an assignment operator. The comparison operator is ==


RE: Help for simplifying code - mmk1995 - Sep-24-2019

(Sep-20-2019, 06:59 AM)perfringo Wrote: With code above you will get NameError (if you haven't somewhere in your code defined none, which would be bad practice).

a, b, c are the same in both cases, so no need to write those two times or put into conditionals. If you like 'clever' one-liners then you can do following regarding x, y, z:

>>> condition = ''
>>> x, y, z = ([x, None][bool(condition)] for x in range(10, 13))
>>> x, y, z
(10, 11, 12)
>>> condition = 'abc'
>>> x, y, z = ([x, None][bool(condition)] for x in range(10, 13))
>>> x, y, z
(None, None, None)

Thanks for answering,
Sorry I am not quite understand the expression you wrote in one line,
It would be very appreciated to explain a bit.
Thanks!


RE: Help for simplifying code - Malt - Sep-24-2019

Same here.. I'm not understanding what @perfringo wrote in single line..
Please explain the code what it is doing Huh Confused


RE: Help for simplifying code - perfringo - Sep-24-2019

Let's explain what different parts are doing and then put them all together:


bool(condition) evaluates whether condition is True or False:

>>> condition = ''      # empty string (list, tuple, dict etc) is False                                   
>>> bool(condition)                                       
False
>>> condition = 42                                        
>>> bool(condition)                                       
True
In Python True and False are 1 and 0:

>>> False == 0                                            
True
>>> True == 1                                             
True
So 'bool(condition)' evaluates and returns False (0) or True (1). This result is used as index:

>>> condition = 42
>>> ['first', 'second'][bool(condition)]                 
'second'                                      # True is 1 and therefore item at index 1 is returned
>>> condition = ''                                        
['first', 'second'][bool(condition)]          # False is 0 and item at index 0 is returned                
'first'
Alternatively it can be expressed this way:

>>> x = 7 < 42                                            
>>> ['first', 'second'][x]                                
'second'
>>> x = 7 > 42                                            
>>> ['first', 'second'][x]                                
'first'
This enables to return either first or second item in list depending whether condition is true or false.

As it was required to have values 10..12 or None depending on condition truthiness list comprehension is used to emit required values, evaluate condition and return corresponding item: 'give me number or None based on whether condition is true or not for every number in range 10..12'

>>> condition = ''                                        
>>> [[number, None][bool(condition] for number in range(10, 13)]                         
>>> [10, 11, 12]
Returned list is unpacked into variables:

>>> first, second, third = [[number, None][bool(condition)] for number in range(10, 13)]                         
>>> first                                                 
10
>>> second                                                
11
>>> third
12