cpython: 132158b287d7 (original) (raw)

--- a/Doc/tutorial/datastructures.rst +++ b/Doc/tutorial/datastructures.rst @@ -235,89 +235,139 @@ and works exactly like this. List Comprehensions ------------------- -List comprehensions provide a concise way to create lists without resorting to -use of :func:map, :func:filter and/or :keyword:lambda. The resulting list -definition tends often to be clearer than lists built using those constructs. -Each list comprehension consists of an expression followed by a :keyword:for -clause, then zero or more :keyword:for or :keyword:if clauses. The result -will be a list resulting from evaluating the expression in the context of the -:keyword:for and :keyword:if clauses which follow it. If the expression -would evaluate to a tuple, it must be parenthesized. :: +List comprehensions provide a concise way to create lists. +Common applications are to make new lists where each element is the result of +some operations applied to each member of another sequence or iterable, or to +create a subsequence of those elements that satisfy a certain condition. + +For example, assume we want to create a list of squares, like:: +

+We can obtain the same result with:: +

+This is also equivalent to squares = map(lambda x: x**2, range(10)), +but it's more concise and readable. + +A list comprehension consists of brackets containing an expression followed +by a :keyword:for clause, then zero or more :keyword:for or :keyword:if +clauses. The result will be a new list resulting from evaluating the expression +in the context of the :keyword:for and :keyword:if clauses which follow it. +For example, this listcomp combines the elements of two lists if they are not +equal::

+and it's equivalent to: +

+Note how the order of the :keyword:for and :keyword:if statements is the +same in both these snippets. + +If the expression is a tuple (e.g. the (x, y) in the previous example), +it must be parenthesized. :: +

-List comprehensions are much more flexible than :func:map and can be applied -to complex expressions and nested functions:: +List comprehensions can contain complex expressions and nested functions::

Nested List Comprehensions --------------------------- +'''''''''''''''''''''''''' -If you've got the stomach for it, list comprehensions can be nested. They are a -powerful tool but -- like all powerful tools -- they need to be used carefully, -if at all. +The initial expression in a list comprehension can be any arbitrary expression, +including another list comprehension. + +Consider the following example of a 3x4 matrix implemented as a list of +3 lists of length 4:: -Consider the following example of a 3x3 matrix held as a list containing three -lists, one list per row::

+The following list comprehension will transpose rows and columns:: +

+As we saw in the previous section, the nested listcomp is evaluated in +the context of the :keyword:for that follows it, so this example is +equivalent to:: -Now, if you wanted to swap rows and columns, you could use a list -comprehension::

- -Special care has to be taken for the nested list comprehension: +which, in turn, is the same as::

- -A more verbose version of this snippet shows the flow explicitly::

-In real world, you should prefer built-in functions to complex flow statements. +In the real world, you should prefer built-in functions to complex flow statements. The :func:zip function would do a great job for this use case::

See :ref:tut-unpacking-arguments for details on the asterisk in this line.