How can I break a list comprehension based on a condition, for instance when the number 412
is found?
Code:
numbers = [951, 402, 984, 651, 360, 69, 408, 319, 601, 485, 980, 507, 725, 547, 544, 615, 83, 165, 141, 501, 263, 617, 865, 575, 219, 390, 984, 592, 236, 105, 942, 941, 386, 462, 47, 418, 907, 344, 236, 375, 823, 566, 597, 978, 328, 615, 953, 345, 399, 162, 758, 219, 918, 237, 412, 566, 826, 248, 866, 950, 626, 949, 687, 217, 815, 67, 104, 58, 512, 24, 892, 894, 767, 553, 81, 379, 843, 831, 445, 742, 717, 958, 609, 842, 451, 688, 753, 854, 685, 93, 857, 440, 380, 126, 721, 328, 753, 470, 743, 527] even = [n for n in numbers if 0 == n % 2]
So functionally, it would be something you can infer this is supposed to do:
even = [n for n in numbers if 0 == n % 2 and break if n == 412]
I really prefer:
import
statement or similar)Conditionals on the ValueNote the line break within the list comprehension before the for expression: this is valid in Python, and is often a nice way to break-up long list comprehensions for greater readibility.
The concept of a break or a continue doesn't really make sense in the context of a map or a filter , so you cannot include them in a comprehension.
As it turns out, you can nest list comprehensions within another list comprehension to further reduce your code and make it easier to read still. As a matter of fact, there's no limit to the number of comprehensions you can nest within each other, which makes it possible to write very complex code in a single line.
Python break statementThe break statement terminates the loop containing it. Control of the program flows to the statement immediately after the body of the loop. If the break statement is inside a nested loop (loop inside another loop), the break statement will terminate the innermost loop.
Use a function to raise StopIteration
and list
to catch it:
>>> def end_of_loop(): ... raise StopIteration ... >>> even = list(end_of_loop() if n == 412 else n for n in numbers if 0 == n % 2) >>> print(even) [402, 984, 360, 408, 980, 544, 390, 984, 592, 236, 942, 386, 462, 418, 344, 236, 566, 978, 328, 162, 758, 918]
For those complaining it is not a one-liner:
even = list(next(iter(())) if n == 412 else n for n in numbers if 0 == n % 2)
For those complaining it is hackish and should not be used in production code: Well, you're right. Definitely.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With