List comprehension and generator expressions are important Python features that allow you to do implicit enumeration in a concise fashion. To give a simple example, the following list comprehension builds a list containing the squares of the numbers from 1 through 5:
gurobi> [x*x for x in [1, 2, 3, 4, 5]] [1, 4, 9, 16, 25]
A generator expression is very similar, but it is used to generate an Iterable
(something that can be iterated over). For example, suppose we want to compute the sum of the squares of the numbers from 1 through 5. We could use list comprehension to build the list, and then pass that list to sum
. However, it is simpler and more efficient to use a generator expression:
gurobi> sum(x*x for x in [1, 2, 3, 4, 5]) 55
A generator expression can be used whenever a method accepts an Iterable
argument (something that can be iterated over). For example, most Python methods that accept a list
argument (the most common type of Iterable
) will also accept a generator expression.
Note that there's a Python routine for creating a contiguous list of integers: range
. The above would typically be written as follows:
gurobi> sum(x*x for x in range(1,6))
Details on the range
function can be found here.
List comprehension and generator expressions can both contain more than one for
clause, and one or more if
clauses. The following example builds a list of tuples containing all x,y
pairs where x
and y
are both less than 4 and x
is less than y
:
gurobi> [(x,y) for x in range(4) for y in range(4) if x < y] [(0, 1), (0, 2), (0, 3), (1, 2), (1, 3), (2, 3)]
Note that the for
statements are executed left-to-right, and values from one can be used in the next, so a more efficient way to write the above is:
gurobi> [(x,y) for x in range(4) for y in range(x+1, 4)]
Generator expressions are used extensively in our Python examples, primarily in the context of creating multiple constraints at once using the addConstrs
method.
Comments
0 comments
Please sign in to leave a comment.