Behaviour of list comprehensions

Peter Otten __peter__ at
Tue Feb 2 09:08:19 EST 2016 at wrote:

> I am having some understandable behaviour from one of my function name
> week_graph_data() which call two functions those return a big tuple of
> tuples, But in function week_graph_data() line no. 30 does not
> work(returns no result in graph or error).
> I have check both functions are called in week_graph_data() individually
> and those run perfectly. (returning tuple of tuples)
> here is my code:

> def week_list_func():
>     """ A function returning list of last 6 days in 3-tuple"""
>     date_list = []
>     for i in xrange(7):
> - timedelta(i)
>         t = d.year, d.month,
>         date_list.append(t)
>     return reversed(date_list)

reversed(date_list) returns an "iterator":

>>> items = reversed(["a", "b", "c"])
>>> items
<list_reverseiterator object at 0x7f43622e9a20>

This means that iteration will "consume" the items

>>> list(items)
['c', 'b', 'a']
>>> list(items)

and thus work only once. To allow for multiple iterations you can return a 
list instead:

>>> items = ["a", "b", "c"]
>>> items.reverse()
>>> items
['c', 'b', 'a']
>>> list(items)
['c', 'b', 'a']
>>> list(items)
['c', 'b', 'a']

Note that list.reverse() is a mutating method and by convention returns 
None. Therefore

   return date_list.reverse() # wrong!

will not work, you need two lines

   return date_list

in your code.

More information about the Python-list mailing list