Python Forum
question about list comprehension
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
question about list comprehension
#1
I understand most of this:

>>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]
Output:
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
Equivalent to:
>>>

>>> combs = []
>>> for x in [1,2,3]:
...     for y in [3,1,4]:
...         if x != y:
...             combs.append((x, y))
...
>>> combs
Output:
[(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)]
What I don't understand is how, in the list comprehension, Python knows to make (x, y) into a list of tuples.

Please use small words. I'm a beginner!

Wait, I think I figured it out. It's already a tuple, and it's in a list. So a new tuple is made every time the conditions of the loops are met?
Reply
#2
(Aug-22-2019, 03:19 AM)Exsul Wrote: Wait, I think I figured it out. It's already a tuple, and it's in a list. So a new tuple is made every time the conditions of the loops are met?
Yes, you are right. If you replace (x, y) with [x, y], you get a list of lists.
Reply
#3
Comprehension in Python is very simple and powerful feature. However, at the beginning it may seem like magic. One way of becoming wizard is to say in spoken language what comprehension does.

Simple example:

'give me number for every number in list which is even':

[num for num in [1, 2, 3, 4, 5] if not num % 2]
To take it into pieces:

num - give me a number
for num in [1, 2, 3, 4, 5] - for every number in list
if not num % 2 - which is even
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply
#4
Quote:What I don't understand is how, in the list comprehension, Python knows to make (x, y) into a list of tuples.

The tuples are made inside the list comprehension explicit.
The container is around the tuples is the list.

The creation of tuples happens often implicit.
def foo():
    return 42, 1337
If you call this function, it will return (42, 1337).
You can write it more explicit:
def foo():
    return (42, 1337)
A for-loop and the assignment operator (=) are doing assignment.
If the returned result is an iterable (tuple, list, something else), you can do argument unpacking:
first, second = foo()
This is useful for enumeration for example.
colors = ['green', 'blue', 'red']
for iterable enumerate(colors):
    print(iterable)
This will return (0, 'green') (1, 'blue') (2, 'red').

Now with argument unpacking on the left side:
for index, color enumerate(colors):
    print(index, color)
You have to pay attention, you need on the left side exactly the same amout of variables, as each iteration returns elements.
To less or to much variables will lead into a ValueError.

Since Python 3.5 this was optimized, we can now consume on the left side all elements, which are too much:

first, *middle, last = range(100)  # <- will iterate over range,
                                   # because on the left side argument unpacking happens
                                   # first get one element
                                   # *middle the rest - the last element
                                   # last get's the last element

first, *last = range(100)
*start, last = range(100)
Another helpful trick is nested argument unpacking.
For example you have some iterable, which yields 2 elements for each iteration.
Then you want to count the index of it with enumerate.

def gen_2():
    """Generator to produce expected data"""
    for i in range(5):
        yield (i, i*2)

generator = gen_2()
for n, (element1, element2) in enumerate(generator):
    print(n, element1, element2)
More explicit:
generator = gen_2()
for (n, (element1, element2)) in enumerate(generator):
    print(n, element1, element2)
This works also with the assignment operator:
a, (b, c) = [1, [2, 3]]
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  List Comprehension Issue johnywhy 5 438 Jan-14-2024, 07:58 AM
Last Post: Pedroski55
Question mypy unable to analyse types of tuple elements in a list comprehension tomciodev 1 427 Oct-17-2023, 09:46 AM
Last Post: tomciodev
  Using list comprehension with 'yield' in function tester_V 5 1,175 Apr-02-2023, 06:31 PM
Last Post: tester_V
  list comprehension 3lnyn0 4 1,359 Jul-12-2022, 09:49 AM
Last Post: DeaD_EyE
  List comprehension used differently coder_sw99 3 1,679 Oct-03-2021, 04:12 PM
Last Post: coder_sw99
  How to invoke a function with return statement in list comprehension? maiya 4 2,746 Jul-17-2021, 04:30 PM
Last Post: maiya
  List comprehension and Lambda cametan 2 2,196 Jun-08-2021, 08:29 AM
Last Post: cametan
  What is the difference between a generator and a list comprehension? Pedroski55 2 2,176 Jan-02-2021, 04:24 AM
Last Post: Pedroski55
  For Loop with List Comprehension muzikman 25 6,406 Dec-18-2020, 10:45 PM
Last Post: muzikman
  Using recursion instead of for loops / list comprehension Drone4four 4 3,072 Oct-10-2020, 05:53 AM
Last Post: ndc85430

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020