Python – Itertools.chain()

The itertools is a module in Python having a collection of functions that are used for handling iterators. They make iterating through the iterables like lists and strings very easily. One such itertools function is chain().

Note: For more information, refer to Python Itertools

chain() function

It is a function that takes a series of iterables and returns one iterable. It groups all the iterables together and produces a single iterable as output. Its output cannot be used directly and thus explicitly converted into iterables. This function come under the category iterators terminating iterators.

Syntax :

chain (*iterables)

The iternal working of chain can be implemented as given below :



def chain(*iterables):
     for it in iterables:
       for each in it:
           yeild (each)

Example 1: The odd numbers and even numbers are in separate lists. Combine them to form a new single list.

filter_none

edit
close

play_arrow

link
brightness_4
code

from itertools import chain
  
# a list of odd numbers
odd =[1, 3, 5, 7, 9]
  
# a list of even numbers
even =[2, 4, 6, 8, 10]
  
# chaining odd and even numbers
numbers = list(chain(odd, even))
  
print(numbers)

chevron_right


Output:

[1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

Example 2: Some of the consonants are in a list. The vowels are given in a list. Combine them and also sort them.

filter_none

edit
close

play_arrow

link
brightness_4
code

from itertools import chain
  
# some consonants
consonants =['d', 'f', 'k', 'l', 'n', 'p']
  
# some vowels
vowels =['a', 'e', 'i', 'o', 'u']
  
# resultatnt list
res = list(chain(consonants, vowels))
  
# sorting the list
res.sort()
  
print(res)

chevron_right


Output:

['a', 'd', 'e', 'f', 'i', 'k', 'l', 'n', 'o', 'p', 'u']

Example 3: In the example below, Each String is considered to be an iterable and each character in it is considered to be an element in the iterator. Thus every character is yielded

filter_none

edit
close

play_arrow

link
brightness_4
code

from itertools import chain
  
res = list(chain('ABC', 'DEF', 'GHI', 'JKL'))
  
print(res)

chevron_right


Output:

['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L']

Example 4:

filter_none

edit
close

play_arrow

link
brightness_4
code

from itertools import chain
  
st1 ="Geeks"
st2 ="for"
st3 ="Geeks"
  
res = list(chain(st1, st2, st3))
print("before joining :", res)
  
ans =''.join(res)
print("After joining :", ans)

chevron_right


Output:



before joining : [‘G’, ‘e’, ‘e’, ‘k’, ‘s’, ‘f’, ‘o’, ‘r’, ‘G’, ‘e’, ‘e’, ‘k’, ‘s’]
After joining : GeeksforGeeks

chain.from_iterable() function

It is similar to chain, but it can be used to chain items from a single iterable. The difference is demonstrated in the example given below:

Example 5:

filter_none

edit
close

play_arrow

link
brightness_4
code

from itertools import chain
  
li =['ABC', 'DEF', 'GHI', 'JKL']
  
# using chain-single iterable.
res1 = list(chain(li))
  
  
res2 = list(chain.from_iterable(li))
  
print("using chain :", res1, end ="\n\n")
  
print("using chain.from_iterable :", res2)

chevron_right


Output:

using chain : [‘ABC’, ‘DEF’, ‘GHI’, ‘JKL’]

using chain.from_iterable : [‘A’, ‘B’, ‘C’, ‘D’, ‘E’, ‘F’, ‘G’, ‘H’, ‘I’, ‘J’, ‘K’, ‘L’]

Example 6: Now consider a list like the one given below :

li=['123', '456', '789']

You are supposed to calculate the sum of the list taking every single digit into account. So the answer should be :

1+2+3+5+6+7+8+9 = 45

This can be achieved easily using the code below :

filter_none

edit
close

play_arrow

link
brightness_4
code

from itertools import chain
  
li =['123', '456', '789']
  
res = list(chain.from_iterable(li))
  
print("res =", res, end ="\n\n")
  
new_res = list(map(int, res))
  
print("new_res =", new_res)
  
sum_of_li = sum(new_res)
  
print("\nsum =", sum_of_li)

chevron_right


Output:

res = ['1', '2', '3', '4', '5', '6', '7', '8', '9']

new_res = [1, 2, 3, 4, 5, 6, 7, 8, 9]

sum = 45

To simplify it, we combine the steps. An optimized approach is given below:

filter_none

edit
close

play_arrow

link
brightness_4
code

from itertools import chain
  
li =['123', '456', '789']
  
res = list(map(int, list(chain.from_iterable(li))))
  
sum_of_li = sum(res)
  
print("res =", res, end ="\n\n")
print("sum =", sum_of_li)

chevron_right


Output:

res = [1, 2, 3, 4, 5, 6, 7, 8, 9]

sum = 45



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.


Article Tags :

1


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.