split method in list comprehension and for loop difference


I wanted to loop over a list an split every three items into one final list i came up with followings :

list comprehension :

inputs = ["1, foo, bar", "2, tom, jerry"]
mylist= [[int(x), y.strip(), z.strip()] for s in inputs for x, y, z in [s.split(",")]]

and for loop :

inputs = ["1, foo, bar", "2, tom, jerry"]
for input in inputs:

but in list comprehension method it was not unpacking into those three variables until i placed [s.split(",")] within bracket while in for loop method it is not needed .
Im curious to know why additional bracket is needed in list comprehension while it is not needed in for loop method ?

>Solution :

The difference is that x,y,z = input.split(',') is an assignment whereas for x, y, z in [s.split(",")] iterates over a collection, just as it would do in regular nested loops. Without the [...] it tries to iterate over the collection returned by s.split and fails to unpack those strings into three variables.

This singleton list approach is actually a common way to create temporary variables in a list comprehension, although I’d suggest to split(", ") so you don’t have to strip afterwards:

mylist= [[int(x), y, z] for s in inputs for x, y, z in [s.split(", ")]]

Alternatively, use a nested generator expression in the list comprehension:

mylist= [[int(x), y, z] for x, y, z in (s.split(", ") for s in inputs)]

The latter is probably the preferred variant, but may not be feasible in all situations.

Leave a ReplyCancel reply