Download presentation
Presentation is loading. Please wait.
Published byGerald Goodwin Modified over 9 years ago
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!
Similar presentations
© 2025 SlidePlayer.com. Inc.
All rights reserved.