list comprehensions syntax with comma

Viewed 462

can you explain this code

[y for _, y in ((1,2),(3,4))]

output is [2, 4]

I do not find a document to use this syntax, but it can be run.

6 Answers

[y for _, y in ((1,2),(3,4))] is a List Comprehension.

This is equivalent to below for:

In [2935]: l = []

In [2936]: for _, y in ((1,2),(3,4)):
      ...:     l.append(y)
      ...: 
      ...: 

In [2937]: l
Out[2937]: [2, 4]

Also _ is a throw-away variable, which means variables you are using while iterating but not really using them for any other purposes.

If you break down the phrase ((1,2),(3,4)) you end up with a tuple of two tuples.

So the iteration goes over the outer tuple, taking the first item in _ and the second in y, from which you take only the second variable, y, and create a new list.

This is as same as this code, which is easier to grasp first:

my_set = ((1,2), (3,4))
my_list = []
for _, y in myset:
    my_list.append(y)

If I convert code to

[y for             x,y in ((1,2),(3,4))]

it is easy to understand _ is equal x

, is in the second statement

You can effectively expand the code as

t = ((1,2),(3,4))
print([y for x, y in t])

Here, replacing x with _ gives back the original one-liner

print([item for item in (("id", 1), ("name", "Yao Yuan"))])
# Output: [('id', 1), ('name', 'Yao Yuan')]
print([(item[0], item[1]) for item in (("id", 1), ("name", "Yao Yuan"))])
# Output: [('id', 1), ('name', 'Yao Yuan')]
print([(key, value) for key, value in (("id", 1), ("name", "Yao Yuan"))])
# Output: [('id', 1), ('name', 'Yao Yuan')]
print([key for key, value in (("id", 1), ("name", "Yao Yuan"))])
# Output: ['id', 'name']
print([value for key, value in (("id", 1), ("name", "Yao Yuan"))])
# Output: [1, 'Yao Yuan']

the syntax with comma x1, x2, ...., xn = (y1, y2, ...., yn) is used to unpack an iterable of length n into n individual variables. The undescore used during unpacking iterables is to say that you don't care about the value in a certain index of the iterable you are unpacking.

so basically, your example is using a list comprehension in which you first unpack each index in the iterable ((1,2),(3,4)) into variables _, y (where _ means disregarding index 0), then you comprehend all y variables into a list = [2, 4]

[y for _, y in ((1,2),(3,4))]
Related