Python Forum
question about list comprehension
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
question about list comprehension
#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


Messages In This Thread
question about list comprehension - by Exsul - Aug-22-2019, 03:19 AM
RE: question about list comprehension - by scidam - Aug-22-2019, 03:26 AM
RE: question about list comprehension - by DeaD_EyE - Aug-22-2019, 08:27 AM

Possibly Related Threads…
Thread Author Replies Views Last Post
  List Comprehension Issue johnywhy 5 683 Jan-14-2024, 07:58 AM
Last Post: Pedroski55
Question mypy unable to analyse types of tuple elements in a list comprehension tomciodev 1 562 Oct-17-2023, 09:46 AM
Last Post: tomciodev
  Using list comprehension with 'yield' in function tester_V 5 1,398 Apr-02-2023, 06:31 PM
Last Post: tester_V
  list comprehension 3lnyn0 4 1,529 Jul-12-2022, 09:49 AM
Last Post: DeaD_EyE
  List comprehension used differently coder_sw99 3 1,837 Oct-03-2021, 04:12 PM
Last Post: coder_sw99
  How to invoke a function with return statement in list comprehension? maiya 4 3,004 Jul-17-2021, 04:30 PM
Last Post: maiya
  List comprehension and Lambda cametan 2 2,332 Jun-08-2021, 08:29 AM
Last Post: cametan
  What is the difference between a generator and a list comprehension? Pedroski55 2 2,312 Jan-02-2021, 04:24 AM
Last Post: Pedroski55
  For Loop with List Comprehension muzikman 25 7,112 Dec-18-2020, 10:45 PM
Last Post: muzikman
  Using recursion instead of for loops / list comprehension Drone4four 4 3,269 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