PEP: 202 Title: List Comprehensions Author: Barry Warsaw
<barry@python.org> Status: Final Type: Standards Track Content-Type:
text/x-rst Created: 13-Jul-2000 Python-Version: 2.0 Post-History:

Introduction

This PEP describes a proposed syntactical extension to Python, list
comprehensions.

The Proposed Solution

It is proposed to allow conditional construction of list literals using
for and if clauses. They would nest in the same way for loops and if
statements nest now.

Rationale

List comprehensions provide a more concise way to create lists in
situations where map() and filter() and/or nested loops would currently
be used.

Examples

    >>> print [i for i in range(10)]
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

    >>> print [i for i in range(20) if i%2 == 0]
    [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

    >>> nums = [1, 2, 3, 4]
    >>> fruit = ["Apples", "Peaches", "Pears", "Bananas"]
    >>> print [(i, f) for i in nums for f in fruit]
    [(1, 'Apples'), (1, 'Peaches'), (1, 'Pears'), (1, 'Bananas'),
     (2, 'Apples'), (2, 'Peaches'), (2, 'Pears'), (2, 'Bananas'),
     (3, 'Apples'), (3, 'Peaches'), (3, 'Pears'), (3, 'Bananas'),
     (4, 'Apples'), (4, 'Peaches'), (4, 'Pears'), (4, 'Bananas')]
    >>> print [(i, f) for i in nums for f in fruit if f[0] == "P"]
    [(1, 'Peaches'), (1, 'Pears'),
     (2, 'Peaches'), (2, 'Pears'),
     (3, 'Peaches'), (3, 'Pears'),
     (4, 'Peaches'), (4, 'Pears')]
    >>> print [(i, f) for i in nums for f in fruit if f[0] == "P" if i%2 == 1]
    [(1, 'Peaches'), (1, 'Pears'), (3, 'Peaches'), (3, 'Pears')]
    >>> print [i for i in zip(nums, fruit) if i[0]%2==0]
    [(2, 'Peaches'), (4, 'Bananas')]

Reference Implementation

List comprehensions become part of the Python language with release 2.0,
documented in[1].

BDFL Pronouncements

-   The syntax proposed above is the Right One.
-   The form [x, y for ...] is disallowed; one is required to write
    [(x, y) for ...].
-   The form [... for x... for y...] nests, with the last index varying
    fastest, just like nested for loops.

References

[1] http://docs.python.org/reference/expressions.html#list-displays