Presentation is loading. Please wait.

Presentation is loading. Please wait.

COSC 1306 COMPUTER SCIENCE AND PROGRAMMING Jehan-François Pâris

Similar presentations


Presentation on theme: "COSC 1306 COMPUTER SCIENCE AND PROGRAMMING Jehan-François Pâris"— Presentation transcript:

1 COSC 1306 COMPUTER SCIENCE AND PROGRAMMING Jehan-François Pâris jfparis@uh.edu

2 CHAPTER IV LISTS

3 Introduction Lists are the most important compound data structure in Python You can do virtually everything with them  Tuples and sets are much less important  Dictionaries are very useful but less general

4 The basics Lists are sequences of items  separated by commas  enclosed in square brackets ("[…]") Examples  [ 1, 2, 3,4,5]  ['Alice', 'Bob', 'Carol', Dean']  ['Alice', 'freshman', [100, 90, 70]]

5 Motivation Let you manipulate composite data:  Student records: ["Baker, Jane", 90, 85, 82, 89]  Appointments: ["2:30pm", "COSC 1306", "SEC 203", "MW"]  Numerous mathematical constructs Cartesians coordinates, complex numbers, vectors, determinants, matrices, …

6 Usages Group together similar objects  Lists of people, courses, exams  Vectors and matrices of algebra and physics Store records  Contact list entry ['Bill', 713-555-1234, 'bill.tran@ xyx.com']  Anything else

7 Operations Access the elements of a list  Individual elements  Slices Modify its elements Insert elements  Anywhere Remove elements

8 Lists >>> mylist = [11, 12, 13, 14, 'done'] >>> mylist [11, 12, 13, 14, 'done'] >>> print(mylist) [11, 12, 13, 14, 'done'] >>> mylist[0] 11  We can access individual elements

9 List slices >>> mylist[0:1] [11] Two observations  A list slice is a list  mylist[0:1] starts with list[0] but stops before mylist [1]

10 More list slices >>> mylist[0:2] [11, 12]  Includes mylist[0] and mylist[1] >>> mylist[0:] [11, 12, 13, 14, 'done']  The whole list >>> mylist[1:] [12, 13, 14, 'done']  The list minus its first (zero-th) element

11 More list slices >>> mylist[-1:] ['done'] A list slice is a list >>> mylist[-1] 'done' Not the same thing!

12 An example a = [10, 20, 30, 40, 50] 1020503040 a designates the whole list a[4] a[1] a[2]a[0]a[3]

13 Lists in geometry (I) Consider a point A in the Cartesian plane  It has two coordinates x A and y A A xAxA yAyA

14 Lists in geometry (II) We will represent each point in the Cartesian plane by a list a with two elements such that  a[0] represents x A  a[1] represents y A Can now speak of the origin as point [0, 0]

15 Distance between two points The distance between two points A and B is the square root of  (A x – B x ) 2 + (A y – B y ) 2 Pythagora's theorema STEM Students mostly

16 Why? xAxA yAyA A xBxB yByB B STEM Students mostly

17 Function computing this distance >>> def distance( a, b) : """ Cartesian distance between a and b ""“ import math return math.sqrt((a[0] - b[0])**2 + (a[1] - b[1])**2) STEM Students mostly

18 Function computing this distance >>> origin = [0, 0] >>> a = [1, 1] >>> distance(origin, a) 1.4142135623730951 >>> STEM Students mostly

19 Lists in physics (I) Speed, accelerations can be expressed by vectors In Cartesian plane force F has two components  F x and F y We will represent each force F by a list f with two elements such that  f[0] represents F x  f[1] represents F y STEM Students mostly

20 Lists in geometry (II) F FxFx FyFy θ STEM Students mostly

21 Absolute value of a force >>> def vecmodule(f) """ Module of a two-dimensional vector ""“ import math return math.sqrt(f[0]**2 + f[1]**2) >>> vecmodule([0,2]) 2.0 >>> vecmodule([3,4]) 5.0 STEM Students mostly

22 Adding two vectors (I) [0, 2] + [0, 3] [0, 2, 0, 3]  Not what we want  + operator concatenates lists STEM Students mostly

23 x y F G F+G GxGx FxFx GyGy FyFy STEM Students mostly Adding two vectors (II)

24 Adding two vectors (III) >>> def vecadd(f, g) : """ adds two two-dimensional vectors ""“ return [f[0] + g[0], f[1] + g[1]] >>> vecadd([0, 2], [0, 3]) [0, 5]  A function can return a list STEM Students mostly

25 Multiplying two vectors Which product?  Dot product Returns a scalar  Cross product Returns a vector  Applies to three-dimensional spaces STEM Students mostly

26 Dot product def dotproduct (f, g): “”” dot product of two two-dimensional vectors ""“ return f[0]*g[0] + f[1]*g[1] >>> dotproduct([1,0], [2, 2]) 2 STEM Students mostly

27 List of lists (I) >>> a = [[1, 2], [3, 1]] >>> a [[1, 2], [3, 1]] >>> a[0] [1, 2] >>> a[1][1] 1

28 List of lists (II) Can be used to represent matrices () a 00 a 01 a 00 a 11 STEM Students mostly

29 Sorting lists >>> mylist = [11, 12, 13, 14, 'done'] >>> mylist.sort() Traceback (most recent call last): File " ", line 1, in mylist.sort() TypeError: unorderable types: str() < int()  Cannot compare apples and oranges

30 Sorting lists of strings >>> namelist = ['Alice', 'Carol', 'Bob'] >>> namelist.sort() >>> print(namelist) ['Alice', 'Bob', 'Carol'] namelist.sort() is a method applied to the list namelist  In-place sort

31 Sorting lists of numbers >>> newlist = [0, -1, +1, -2, +2] >>> newlist.sort() >>> print(newlist) [-2, -1, 0, 1, 2] In-place sort

32 Sorting into a new list >>> newlist = [0, -1, +1, -2, +2] >>> sortedlist= sorted(newlist) >>> print(newlist) [0, -1, 1, -2, 2] >>> print(sortedlist) [-2, -1, 0, 1, 2]  sorted(…) is a conventional Python function that returns a new list

33 Modifying the elements of a list >>> mylist = [11, 12, 13, 14, 'done'] >>> mylist[-1] = 'finished' >>> mylist [11, 12, 13, 14, 'finished'] >>> mylist[0:4] = ['XI', 'XII', 'XIII', 'XIV'] >>> mylist ['XI', 'XII', 'XIII', 'XIV', 'finished']

34 Lists of lists (I) >>> listoflists = [[17.5, "1306"], [13, "6360"]] >>> listoflists.sort() >>> print(listoflists) [[13, '6360'], [17.5, '1306']] >>> listoflists[0] [13, '6360'] >>> listoflists[1] [17.5, '1306']

35 Lists of lists (II) >>> listoflists[0][0] 13 >>> listoflists[1][1] '1306' >>> listoflists[0][1] ='6360 quiz' >>> listoflists [[13, '6360 quiz'], [17.5, '1306']]

36 Adding elements to a list >>> mylist = [11, 12, 13, 14, 'finished'] >>> mylist.append('Not yet!') >>> mylist [11, 12, 13, 14, 'finished', 'Not yet!']

37 Adding elements to a list (I) >>> mylist = [11, 12, 13, 14, 'finished'] >>> mylist.append('Not yet!') >>> mylist [11, 12, 13, 14, 'finished', 'Not yet!']

38 Adding elements to a list (II) >>> listoflists = [[13, '6360 quiz'], [17.5, '1306']] >>> listoflists.append([15.3, 'ABET']) >>> listoflists [[13, '6360 quiz'], [17.5, '1306'], [15.3, 'ABET']] Appending means adding at the end.

39 Adding elements inside a list (I) >>> mylist = [11, 12, 13, 14, 'finished'] >>> mylist.insert(0, 10) >>> mylist [10, 11, 12, 13, 14, 'finished'] >>> mylist.insert(5, 15) >>> mylist [10, 11, 12, 13, 14, 15, 'finished']

40 Adding elements inside a list (II) >>> mylist = [11, 12, 13, 14, 'finished'] >>> mylist.insert(0, 10) >>> mylist [10, 11, 12, 13, 14, 'finished'] >>> mylist.insert(5, 15) >>> mylist [10, 11, 12, 13, 14, 15, 'finished']

41 Adding elements inside a list (III) mylist.insert(index, item)  index specifies element before which the new item should be inserted mylist.insert(0, item) inserts the new item before the first element mylist.insert(1, item) inserts the new item before the second element and after the first one

42 Example (I) a = [10, 20, 30, 40, 50] 1020503040 a designates the whole list a[4]a[1]a[2] a[0] a[3]

43 Example (II) Where to insert 25 and keep the list sorted? 1020503040 a a[4]a[1]a[2] a[0] a[3]

44 Example (III) Where to insert 25 and keep the list sorted? 1020503040 a a[4]a[1]a[2] a[0] a[3] 25

45 Example (IV) We do  a.insert(2, 25) after a[1] and before a[2]

46 Let us check >>> a = [10, 20, 30, 40, 50] >>> a.insert(2,25) >>> a [10, 20, 25, 30, 40, 50]

47 Example (V) Where to insert 55 and keep the list sorted? 1020503040 a a[4]a[1]a[2] a[0] a[3]

48 Example (VI) Where to insert 55 and keep the list sorted? 1020503040 a a[4]a[1]a[2] a[0] a[3] 55

49 Example (VII) We must insert  After a[4]  Before no other element We act as if a[5] existed  a.insert(5, 55) It works! Same as a.append(55)

50 Let us check >>> a = [10, 20, 30, 40, 50] >>> a.insert(5, 55) >>> a [10, 20, 30, 40, 50, 55]

51 Let us make it a bit easier len(list)  returns the length of a list Same as number of its elements Equal to index of last element plus one We could have written  a.insert(len(a), 55) Same as a.append(55)

52 Removing items One by one thislist.pop(i)  removes thislist[i] from thislist  returns the removed element thislist.pop( )  removes the last element from thislist  returns the removed element

53 Examples (I) >>> mylist = [11, 22, 33, 44, 55, 66] >>> mylist.pop(0) 11 >>> mylist [22, 33, 44, 55, 66]

54 Examples (II) >>> mylist.pop() 66 >>> mylist [22, 33, 44, 55] >>> mylist.pop(2) 44 >>> mylist [22, 33, 55]

55 Sum: one more useful function >>> list = [10, 20,20] >>> sum(list) 50 >>> list = ['Alice', ' and ', 'Bob'] >>> sum(list)  Does not work! Would get same results with tuples

56 Initializing lists Use list comprehensions >>> [ 0 for n in range(0, 9)] [0, 0, 0, 0, 0, 0, 0, 0, 0] >>> [n for n in range (1,11)] [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> [2*n+1 for n in range(0, 6)] [1, 3, 5, 7, 9, 11]

57 Warning! The for n clause is essential [0 in range(0, 10)] [True]  Because 0 is in range(0, 10)

58 More comprehensions >>> [ c for c in 'COSC 1306'] ['C', 'O', 'S', 'C', ' ', ‘1', '3', '0', '6'] >>> names = ['Alice', 'bob', 'carol'] >>> cap_names =[n.capitalize() for n in names] >>> names ['Alice', 'bob', 'carol'] >>> cap_names ['Alice', 'Bob', 'Carol']

59 An equivalence [2*n+1 for n in range(0, 6)] [1, 3, 5, 7, 9, 11] is same as a = [ ] for n in range(0,6) : a.append(2*n + 1)

60 Filtered comprehensions >>> a = [11, 22, 33, 44, 55] >>> b = [ n for n in a if n%2 == 0] >>> b [22, 44] >>> c = [n//11 for n in a if n > 20] >>> c [2, 3, 4, 5] A very powerful tool !

61 Making things more complicated >>> from random import uniform >>> >>> def gilligan(k):... return 4 * sum([1 for c in [uniform(0,1)**2+uniform(0,1)**2 for _ in range(k)] if c < 1]) / float(k)... >>> gilligan(100000) 3.13396 I did not write this code float(..) required by 2.7.2

62 Understanding the function (I) The function gilligan computes successive approximations of π  It simulates throwing random darts into a one by one square place at the origin of axes (1, 1) inside quarter circle

63 Understanding the function (II) The area inside the quarter circle is equal to πr 2 /4  Reduces to π/4 since r = 1 The probability that a random dart will fall inside the quarter circle is π/4, which we want to estimate Assume that k out of n darts fall inside the quarter circle  The ratio k/n will provide an estimator of π/4

64 Understanding the function (III) My friend used two comprehensions [uniform(0,1)**2+uniform(0,1)**2 for _ in range(k)]  creates a list containing k instances of uniform(0,1)**2+uniform(0,1)**2  the underscore ('_') denotes the last evaluated expression

65 Understanding the function (IV) [1 for c in […] if c < 1]  creates a list containing a 1 for each value in c such that c < 1  each entry of the new list represents one dart that felt into the circle

66 Understanding the function (V) The last step is summing the contents of the outer list sum([1 for c in […] if c < 1])  returns total number of darts each entry of the new list represents one dart that felt into the circle

67 Programming styles My friend's programming style favors conciseness over clarity I prefer clarity  Code should be so dumb that anyone could understand it without any effort Our definitions of clarity shift over time  What appears obscure to us today will appear trivial once we are familiar with the language

68 The for statement (I) for i in range(low, high):  Repeats high – low times  For all integer values of i between low and hi – 1  low  i < hi

69 Example >>> for i in range(1, 5) : print ('Iteration %d' %i) Iteration 1 Iteration 2 Iteration 3 Iteration 4 5 is NOT in range(1, 5)

70 Observation If you want to execute a loop n times, use  for i in range(0, 5)  for i in range (1, 6)  for i in range (2, 7)  …

71 The for statement (II) for i in a :  a must be a list or a string  Repeats len(a) times  For all elements of a  for names in [‘Alice’, ‘Bob’, ‘Carol’]

72 Example (I) >>> names = ['Alice', 'Bob', 'Carol'] >>> for name in names : print('Hi ' + name + '!') Hi Alice! Hi Bob! Hi Carol! >>>

73 Example (II): better dot product def dotproduct(a, b) : if len(a) != len(b) : print("We must raise an exception!") return "Error" product = 0 for i in range(0, len(a)) product += a[i]*b[i] return product

74 Membership Can test membership in a list  a in alist returns True is a is in alist and False otherwise Will use it in if statements  if a in alist :

75 Example (I) >>> def ismember (a, list) : if a in alist : return '%s in %s' %(str(a), str(list)) else : return '%s NOT in %s' %(str(a), str(list))

76 Example (II) >>> ismember('Bob', ['Alice', 'Carol']) "Bob NOT in ['Alice', 'Carol']" >>> ismember('Alice', ['Alice', 'Carol']) "Alice in ['Alice', 'Carol']"

77 Copying/Saving a list >>> a = ["Alice", "Bob", "Carol"] >>> saved = a >>> a.pop(0) 'Alice' >>> a ['Bob', 'Carol'] >>> saved ['Bob', 'Carol'] We did not save anything!

78 Mutable and immutable quantities By default, Python quantities are immutable  Each time you modify them, you create a new value Expensive solution that works as we expect it

79 Mutable and immutable quantities Python lists are mutable  They can be modified in place  a = [1, 5, 3] can be sorted without making a new copy of the list Much cheaper solution  Can cause surprises!

80 How Python implements variables A Python variable contains the address of its current value a = 5 a 5

81 How Python implements variables A Python variable contains the address of its current value a = 5 b = a a 5 b

82 How Python implements variables A Python variable contains the address of its current value a = 5 b = a a = a +1 a 5 b 6

83 How Python implements variables This work as we expected  We saved the old value of a into be before modifying it People write  a = 5 # initial value  b = a # save initial value  a = a +1 # increment

84 A big surprise >>> a = [11, 33, 22] >>> b = a >>> b [11, 33, 22] >>> a.sort() >>> a [11, 22, 33] >>> b [11, 22, 33] The old value of a was not saved!

85 What happened (I) >>> a = [11, 33, 22] >>> b = a >>> b [11, 33, 22] a [11, 33, 22] b

86 What happened (II) >>> a = [11, 33, 22] >>> b = a >>> b [11, 33, 22] >>> a.sort() >>> a [11, 22, 33] >>> b [11, 22, 33] a [11,22, 33] b

87 Why this mess? Making lists immutable would have made Python much slower Conflict between ease of use and speed  This time speed won! Because speed penalty would have been very big

88 How to copy a list Copy a slice containing the whole list >>> a = [11, 33, 22] >>> b = a[:] >>> a.sort() >>> a [11, 22, 33] >>> b [11, 33, 22] Silly but it works!


Download ppt "COSC 1306 COMPUTER SCIENCE AND PROGRAMMING Jehan-François Pâris"

Similar presentations


Ads by Google