Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lfa:lab01-python-intro [2021/09/14 09:38]
pdmatei
lfa:lab01-python-intro [2021/10/07 11:32] (current)
ioana.georgescu [List comprehensions]
Line 45: Line 45:
 l[:x] l[:x]
 # the last element of a list: # the last element of a list:
-l[:-1]+l[-1]
 # the last three elements of a list: # the last three elements of a list:
-l[:-3]+l[-3:]
 # the slice from n-3 to n-1, where n is the number of elements from the list # the slice from n-3 to n-1, where n is the number of elements from the list
 l[-3:-1] l[-3:-1]
Line 188: Line 188:
  
 def getYouth(l):​ def getYouth(l):​
-    ​def age(entry): + # this function computes the age of a given CNP 
-        if int(entry[5:8]) <= 21: +    ​def age(cnp): 
-            return 2021 - int("​20"​+entry[5:8]) +        # conversion to integer of the two-character year code 
-        else  +        if int(cnp[5:8]) <= 21: 
-            return 2021 - int("​19"​+entry[5:8]) +            return 2021 - int("​20"​+cnp[5:7]) 
-             +        else: 
-    avg = reduce(lambda a,​b:​a+b, ​map(age,l)) / len(l) +            return 2021 - int("​19"​+cnp[5:7]) 
-    [(ln,​age(cnp)) for (fn,ln,cnp) in l if cnp[0]=='​2'​]+     
 +    # computing the average ages (a map could have also been used) 
 +    avg = reduce(lambda a,​b:​a+b, ​[age(x[-1]for x in l]) / len(l) 
 +    ​ 
 +    # we return the last name and the age of the filtered list l 
 +    return ​[(ln,​age(cnp)) for (fn,ln,cnp) in l if cnp[0]=='​2' ​and age(cnp) <= avg]
 </​code>​ </​code>​
 </​hidden>​ </​hidden>​
  
  
-Inner functions 
-List comprehensions,​ filters 
-Classes and inheritance,​ instance-of 
-toString 
-Higher-order functions and lambdas 
-Unpacking (for tuples, lists) 
  
  
-<hidden The Pythonic way> This text will be hidden <code python> solution </​code>​ </​hidden>​ 
  
  
  
-**Exercise 6** Write a function which searches for a list of patterns in a text. 
-<code python> 
-def find_patterns (pattern_list,​ text): 
-    # checks if pattern is found at position index in text 
-    def inner_search (pattern,​index):​ 
-</​code>​ 
  
-Remark: 
-  * Python supports functional-style programming to some extent. 
-<code python> 
-def plus1(x): 
-    return x + 1 
-    ​ 
-print(map(plus1,​[1,​2,​3])) 
-print(map(lambda x:x+1, [1,2,3])) 
-</​code>​ 
  
  
-**Exercise 8** Modify the previous implementation and instead of ''​for'',​ use ''​map''​ (cast the return of ''​map''​ to ''​list'':​ ''​list(map(...))''​) +/*
- +
-However, it is more common in Python to employ ​//list comprehensions//​ instead of ''​map'':​ +
- +
-<code python>​ +
-def plus1(x): +
-    return x + 1 +
-     +
-print([plus1(x) for x in [1,2,3]]) +
-print([(x + 1) for x in [1,​2,​3]])) +
-</​code>​ +
- +
-List comprehensions also support the functionality of ''​filter'':​ +
- +
-<code python>​ +
-print([(x+1) for x in [1,​2,​3,​4,​5,​6] if (x % 2 == 0)]) +
-</​code>​ +
- +
-**Exercise 9*Modify the previous implementation and instead of ''​for'',​ use list comprehensions.+
  
 ==== Classes and inheritance ==== ==== Classes and inheritance ====
Line 314: Line 279:
   * Extend the class example shown previously to include class ''​Node''​ which models non-empty trees. Implement methods ''​size''​ and ''​contains''​.   * Extend the class example shown previously to include class ''​Node''​ which models non-empty trees. Implement methods ''​size''​ and ''​contains''​.
  
 +
 +*/
 +
 +===== Practice =====
 +
 +A labelled graph is encoded as a file where:
 +  * **the first line** consists of the number of nodes
 +  * **each subsequent line** is an edge ''<​from>​ <​label>​ <​to>''​
 +Example:
 +<​code>​
 +5
 +0 X 1
 +1 O 2 
 +1 X 3
 +1 O 4
 +4 X 1
 +3 O 2
 +</​code>​
 +
 +  * Suppose we encode streets as labelled graphs, where each label '​X'​ or '​O'​ denotes if a street is closed or open. 
 +  * Compute the set of accessible nodes from a given **source**, via open streets.
 +  * (Hint1: google //Python read lines// to see how to read from a file; also, google ''​split''​ in Python)
 +  * (Hint2: you will need a dictionary to store, for each node and label l, the list of its l-successors)
 +
 +
 +===== Haskell practice =====
 +
 +Solve the same exercise, only build your own input as a string, instead of a file.