Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using break in a list comprehension

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:

  • a one-liner
  • no other fancy libraries like itertools, "pure python" if possible (read: the solution should not use any import statement or similar)
like image 747
Flavius Avatar asked Mar 05 '12 19:03

Flavius


People also ask

Can you break a list comprehension Python?

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.

Can we use continue in list comprehension?

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.

Can you nest list comprehensions?

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.

How do you break in Python?

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.


1 Answers

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.

like image 113
Reinstate Monica Avatar answered Sep 20 '22 15:09

Reinstate Monica