Python Gem #9: itertools.chain
You will often find yourself needing to do an operation on a list of lists — say, sum all of them up. The immediate approach is typically;
intermed = [sum(x) for x in lsofls]
result = sum(intermed)
However, there is an extremely useful function for just these kinds of operations within the itertools
module, called chain. Roughly speaking, chain takes in a list of iterables and knits them together into one
chain([1,2,3], [4,5,6]) # ==> itertools.chain object of [1, 2, 3, 4, 5, 6]
This can be achieved for a list of lists by unpacking the list;
chain(*lsofls) # ==> itertools.chain object of [1, 2, 3, 4, 5, 6]
By default the output will be an itertools.chain
object, and will need to be passed to a list constructor in order to be used as a list. However, sum
, reduce
, map
and other iterator functions can be used directly on the object itself. Therefore, our original code becomes:
result = sum(chain(*lsofls))
This is a daily series called Python Gems. Each short posts covers a detail, feature or application of the python language that you can use to increase your codes readability while decreasing its length.