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+=1coding 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,3Thanks! 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] 2Or 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] 2EDIT: 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: 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). 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 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) TrueIn Python True and False are 1 and 0: >>> False == 0 True >>> True == 1 TrueSo '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 |