Python (Chapter 5.3) : Advanced features of LIST


For any type of consultation, query or doubt. You may contact to the following: (+91) 9804 436 193 debabrataguha20@gmail.com 
and join the group  https://www.facebook.com/groups/331231161093613/




Part 1: LAMBDA FUNCTIONS

Purpose or the Usage of Lambda function is similar to a Function or method. Anyone who does not know FUNCTION or METHOD skip the following code:

def func(a):
    print (a*a)
func (2)
func (3)
func (4)

Output:

4
9
16


In Lambda Function, our purpose is the same. To reuse the code , instead of writing the same code for different values again and again. First we will try to learn the syntax of using LAMBDA function. It does not require any prior knowledge on methods/functions.


Example 1:
func = lambda x : x*x
print ( func(2) )
print ( func(3) )
print ( func(4) )

Output:

4
9
16




There are 3 parts of a LAMBDA function.

Part 1: “ func = “

“func” is the function name, We can call the python code by this name “func” again and again.


Part 2: “ lambda x ”

      variables mentioned after the word  lambda” will be the parameter given by user. Different values given by users will be entered into the code as “x”.


Part 3: “ : x * x ”

               The python logic written after the colon (“:”) will be returned. In the above program, if we have entered 2 as x, it will return x*x means 4.









For the simple logics like to print the square value of a number, you will not be able to understand the meaning of “Reusing code”. But you will be able to know the meaning when I will write the logic to print the Fahrenheit temp into celcius.

Example 2:

func=lambda x: 5*(x-32)/9
print (func(-40))
print (func(212))
print (func(32))

Output:
-40
100
0








We can use multiple parameters like x,y ..

Example 3:
func=lambda x,y : x*x + y*y
print (func(2,3))
print (func(5,6))
print (func(-6,7))

Output:
13
61
85








Part 2: LAMBDA FUNCTIONS WITH MAP

Map is being used to perform a calculation with the help of a set of values or multiple set of values.

The basic structure of map is like below:

map ( lambda x: x*x , ListName )

or in simple words,

map(function_object, iterable1, iterable2,...)




Now we will repeat example 2 for a set of values kept in a list

Using map function, we can convert all the values of the list “Temp” and store into “Temp2”.


Example 3:
temp = [ -40, 212, 32]
temp2 = list( map ( lambda x: 5*(x-32)/9 , temp))
print ( temp2 )

Output:
[ -40 , 100, 0 ]

              



Example 4:
arr1=[100,200,300,400]
result=list(map(lambda x: x*x , arr1))
print(result)

Output:
[ 10000 , 40000, 90000 , 160000 ]

              




We can use multiple parameters like x,y .. but the parameters will be taken from different lists.

Example 5:
arr1=[100,200,300,400]
arr2=[10,20,30,40]
result=list(map(lambda x,y : x*x + y*y , arr1 , arr2))
print(result)

Output:
[ 10100 , 40400, 90900 , 161600 ]

              



Example 6:
arr1=[100,200,300,400]
arr2=[10,20,30,40]
arr3=[1,2,3,4]

result=list(map(lambda x,y,z : x*x + y*y + z*z , arr1 , arr2 , arr3))
print(result)

Output:
[ 10101 , 40404, 90909 , 161616 ]

              





We can even directly use a list in the map function in following manner.

Example 7:
arr1=[100,200,300,400]
arr2=[10,20,30,40]

result=list(map(lambda x,y,z : x*x + y*y + z*z , arr1 , arr2 , [1,2,3,4]))
print(result)

Output:
[ 10101 , 40404, 90909 , 161616 ]










We can even use the lists having uneven elements inside. It will calculate the term as per the shortest list then. Please check the below program. It will be easy to understand. Arr3 is having only 3 elements. So the final answer is also for 3 elements only

Example 8:
arr1=[100,200,300,400]
arr2=[10,20,30,40]
arr3=[1,2,3]

result=list(map(lambda x,y,z : x*x + y*y + z*z , arr1 , arr2 , arr3))
print(result)

Output:
[ 10101 , 40404, 90909 ]







Part 3: LAMBDA FUNCTIONS WITH FILTER

Filter is being used to choose some values from a set of values on some criteria or condition.

The basic structure of FILTER is like below:

filter ( lambda x: x%2 == 0 , ListName )

or in simple words,

filter (function_object, iterable1, iterable2,...)





Example 9:
arr1=[10,20,30,40,50]
result=list(filter(lambda x : x % 4 ==0 , arr1 ))
print(result)

Output:
[ 20, 40 ]

              





Example 10:
arr1=[10,20,30,40,50]
result=list(filter(lambda x : x % 4 != 0 , arr1 ))
print(result)

Output:
[ 10, 30, 50 ]

              






We can remove  “!=” from the criteria. It will be same like not equals to. Please the following program.

Example 11:
arr1=[10,20,30,40,50]
result=list(filter(lambda x : x % 4 , arr1 ))
print(result)

Output:
[ 10, 30, 50 ]

              







We can also use IN function with FILTER function.

Example 12:
arr1=[10,20,30,40,50]
arr2=[10,30,60,70,80]
result=list(filter(lambda x : x in arr1, arr2 ))
print(result)

Output:

              





We can also use IN RANGE function with FILTER function.

Example 13:
arr1=[10,20,30,40,50]
result=list(filter(lambda x : x in range(30) , arr1 ))
print(result)

Output:
[ 10, 20 ]

              





Part 4: LAMBDA FUNCTIONS WITH REDUCE

REDUCE function is being used to perform a function repeatedly through all the elements of the list.

The basic structure of REDUCE is like below:

reduce ( lambda x,y: x + y , ListName )

or in simple words,

filter (function_object, iterable)

One point is to be notified here is that REDUCE is available under “functool” package.







Example 14:
import functools
lst= [10,20,30,40,50]
print ( functools.reduce ( lambda x,y: x + y , lst ) )

Output:
150

What it does is to add 10 (1st term) and 20 (2nd term) and the answer become 30
Then 30 (sum) + 30 (3rd term) =60
Then 60 (sum) + 40 (4th term) =100
Then 100 (sum) + 50 (5th term) = 150







Example 15:
import functools
# finding maximum

lst= [10,20,30,40,50]
print ( functools.reduce(lambda x,y : x if x > y else y , lst ))

Output:
50







We can use a range of numbers instead of a list

Example 16:

import functools
# finding maximum

print ( functools.reduce ( lambda x,y : x if x > y else y , range(1,30) ) )

Output:
29

              







Example 17:

import functools
# finding maximum

print ( functools.reduce ( lambda x,y : x if x > y else y , range(1,30) ) )

Output:
29

              








Example 18:

import functools
# finding (1 + 2 + 3 + … + 29) / ( 1 * 2 * 3 * 4 )

print ( functools.reduce ( lambda x,y : x + y , range(1,30) ) / functools.reduce ( lambda x,y : x * y , range(1,5) ) )

Output:
18.125





              



Part 5: LIST USING SET

We can use some short cut using the set theory of mathematics. If you do not know anything about Set theory, no need to worry. See the basic operations of set as below.

1.      We can easily convert a list into a set. Both are having a similar type of look.

lst=[10,20,30,40,50]
st = set (lst)
print (st)

      Output:
                  { 10 , 20, 30, 40, 50 }


2.      We can easily extract the intersection of the lists

lst1=[10,20,30,40,50]
lst2=[40,50,60]
st1 = set (lst1)
st2 = set (lst2)

print ( st1 & st2 )
print (list(st1 & st2))

Output:
                  { 40, 50 }
                  [ 40, 50 ]


               Alternatively we can use .intersection() method as well.

lst1=[10,20,30,40,50]
lst2=[40,50,60]
st1 = set (lst1)
st2 = set (lst2)

print ( st1.intersection( st2 ) )
print (list(st1.intersection( st2 )))

Output:
                  { 40, 50 }
                  [ 40, 50 ]


3.      We can easily extract the union of the lists

lst1=[10,20,30,40,50]
lst2=[40,50,60]
st1 = set (lst1)
st2 = set (lst2)

print ( st1 | st2 )
print (list(st1 | st2))

Output:
                  {10, 20, 30, 40, 50, 60}
                  [10, 20, 30, 40, 50, 60]


               Alternatively we can use .union() method as well.

lst1=[10,20,30,40,50]
lst2=[40,50,60]
st1 = set (lst1)
st2 = set (lst2)

print ( st1.union( st2 ) )
print (list(st1.union( st2 )))

Output:
                  {10, 20, 30, 40, 50, 60}
                  [10, 20, 30, 40, 50, 60]




4.      We can even do this for multiple number of lists

lst1=[10,20,30,40,50]
lst2=[40,50,60]
lst3=[90,100]
st1 = set (lst1)
st2 = set (lst2)
st3 = set (lst3)

print ( st1 | st2 | st3 )
print (list(st1 | st2 | st3 ))

Output:
                  {10, 20, 30, 40, 50, 60 , 90 , 100 }
                  [10, 20, 30, 40, 50, 60 , 90 , 100 ]




5.      We can easily do set1-set2

lst1=[10,20,30,40,50]
lst2=[40,50,60]
st1 = set (lst1)
st2 = set (lst2)
print ( st1 - st2 )
print (list(st1 - st2))

Output:
                  {10, 20, 30}
                  [10, 20, 30]

               Alternatively we can use .difference() function.

lst1=[10,20,30,40,50]
lst2=[40,50,60]
st1 = set (lst1)
st2 = set (lst2)
print ( st1.difference(st2) )
print (list(st1.difference(st2)))

Output:
                  {10, 20, 30}
                  [10, 20, 30]




6.      We can easily extract the union of the lists

lst1=[10,20,30,40,50]
lst2=[40,50,60]
st1 = set (lst1)
st2 = set (lst2)
print ( st1 | st2 )
print (list(st1 | st2))

Output:
                  {10, 20, 30, 40, 50, 60 , 70}
                  [10, 20, 30, 40, 50, 60 , 70]





Part 6: LIST with Zip:

The purpose of zip() is to map the similar index of multiple containers so that they can be used just using as single entity.

1.      Sort 1st list using the 2nd one:

a.      Zip the two lists.
b.     Create a new, sorted list based on the zip using sorted().
c.      Using a list comprehension extract the first elements of each pair from the sorted, zipped list.

x = ["a", "b", "c", "d", "e", "f", "g", "h", "i"] 
y = [ 0,   1,   1,    0,   1,   2,   2,   0,   1] 
zipped_pairs = zip(list2, list1) 
      z = [x for _, x in sorted(zipped_pairs)]   
print ( z ) 

Output:

['a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g']
['g', 'k', 'r', 'e', 'e', 'g', 's', 'f', 'o']



2.      Print 3 list simultaneously.

num = [1, 2, 3] 
color = ['red', 'while', 'black'] 
value = [255, 256]

for (a, b, c) in zip(num, color, value): 
     print (a, b, c)

               Output:

               1             red         255
               2             white    256

Only 2 rows have been printed due to the length of third list is 2.





3.      itertools.zip_longest() : zip_longest stops when all lists are exhausted. When the shorter iterator(s) are exhausted, zip_longest yields a tuple with None value. Below is an implementation of the itertools.zip_longest which iterates over 3 lists:

num = [1, 2, 3] 
color = ['red', 'while', 'black'] 
value = [255, 256]

for (a, b, c) in itertools.zip_longest(num, color, value): 
     print (a, b, c)

               Output:
               1             red         255
               2             white     256
               3                      black     none



4.      We can also specify a default  value instead of NONE in zip_longest()

num = [1, 2, 3] 
color = ['red', 'while', 'black'] 
value = [255, 256] 

for (a, b, c) in itertools.zip_longest(num, color, value, fillvalue=-1): 
print (a, b, c)

               Output:

               1             red         255
               2             white    256
               3             black     -1


Comments

Popular posts from this blog

Java concepts Theory