Computer Science 15-110, Fall 2010
Class Notes: One-Dimensional Lists
- Creating
Lists
- List Properties (len, min, max, sum)
- Accessing
Elements
- List
Aliases
- Finding
Elements
- Adding
Elements
- Removing
Elements
- Swapping Elements
- Looping
over Lists
- Hazard: Modifying While Looping
- Comparing
Lists
- Copying
Lists
- Sorting Lists
- Using
Lists with Functions
- Optional
/
Advanced Topics
- Suggested
Reading on Lists
- Examples Using Lists
- The Locker Problem
- Anagrams
- Sieve of Eratosthenes and the Prime Counting Function pi(n)
- Suggested Practice Problems
One-Dimensional Lists
- Creating
Lists
# Empty List
a = [ ]
b = list() # also creates an empty list
# List with One Element
a = [ "hello" ]
# List with Multiple Elements
a = [ 2, 3, 5, 7 ]
# List with Multiple Elements of Different Types
a = [ 2, "dog", False, 3.14 ]
# List with Duplicate Elements
a = [ "wow" ] * 5
print a # prints ['wow', 'wow', 'wow', 'wow', 'wow']
# List from Another Sequence Type
a = list("abcd")
print a # prints ['a', 'b', 'c', 'd']
- List Properties (len, min, max, sum)
a = [ 2, 3, 5, 2 ]
print "a = ", a
print "len =", len(a)
print "min =", min(a)
print "max =", max(a)
print "sum =", sum(a)
- Accessing
Elements
# Create a list
a = [2, 3, 5, 7, 11, 13]
print "a =", a
# Access non-negative indexes
print "a[0] =", a[0]
print "a[2] =", a[2]
# Access negative indexes
print "a[-1] =", a[-1]
print "a[-3] =", a[-3]
# Access slices a[start:end:step]
print "a[0:2] =", a[0:2]
print "a[1:2] =", a[1:4]
print "a[1:6:2] =", a[1:6:2]
- List
Aliases
# Create a list
a = [ 2, 3, 5, 7 ]
# Create an alias to the list
b = a
# We now have two references (aliases) to the SAME list
a[0] = 42
b[1] = 99
print a
print b
Another Example:
# Create a list
a = [ 2, 3, 5, 7 ]
# Create an alias to the list
b = a
# Create a different list with the same elements
c = [ 2, 3, 5, 7 ]
# a and b are references (aliases) to the SAME list
# c is a reference to a different but EQUAL list
print "initially:"
print " a==b :", a==b
print " a==c :", a==c
print " a is b:", a is b
print " a is c:", a is c
# Now changes to a also change b (the SAME list) but not c (a different list)
a[0] = 42
print "After changing a[0] to 42"
print " a=",a
print " b=",b
print " c=",c
print " a==b :", a==b
print " a==c :", a==c
print " a is b:", a is b
print " a is c:", a is c
- Finding
Elements
- Check for list membership: in
a = [ 2, 3, 5, 2, 6, 2, 2, 7 ]
print "a =", a
print "2 in a =", (2 in a)
print "4 in a =", (4 in a)
- Check for list non-membership: not in
a = [ 2, 3, 5, 2, 6, 2, 2, 7 ]
print "a =", a
print "2 not in a =", (2 not in a)
print "4 not in a =", (4 not in a)
- Count occurrences in list: list.count(item)
a = [ 2, 3, 5, 2, 6, 2, 2, 7 ]
print "a =", a
print "a.count(1) =", a.count(1)
print "a.count(2) =", a.count(2)
print "a.count(3) =", a.count(3)
- Find index of item: list.index(item)
and list.index(item, start)
- Example
a = [ 2, 3, 5, 2, 6, 2, 2, 7 ]
print "a =", a
print "a.index(6) =", a.index(6)
print "a.index(2) =", a.index(2)
print "a.index(2,1) =", a.index(2,1)
print "a.index(2,4) =", a.index(2,4)
- Problem:
crashes when item is not in list
a = [ 2, 3, 5, 2 ]
print "a =", a
print "a.index(9) =", a.index(9) # crashes!
print "This line will not run!"
- Solution: use (item in list)
a = [ 2, 3, 5, 2 ]
print "a =", a
if (9 in a):
print "a.index(9) =", a.index(9)
else:
print "9 not in", a
print "This line will run now!"
- Adding
Elements
- Destructively (Modifying Lists)
# Create a list
a = [ 2, 3 ]
print "a =", a
# Add an item with list.append(item)
a.append(7)
print "After a.append(7), a=", a
# Add a list of items with list += list2
a += [ 11, 13 ]
print "After a += [ 11, 13 ], a=", a
# Add a list of items with list.extend(list2)
a.extend([ 17, 19 ])
print "After a.extend([ 17, 19 ]), a=", a
# Insert an item at a given index
a.insert(2, 5) # at index 2, insert a 5
print "After a.insert(2, 5), a=", a
- Non-Destructively
(Creating New Lists)
# Create a list
a = [ 2, 3, 7, 11 ]
print "a =", a
# Add an item with list1 + list2
b = a + [ 13, 17 ]
print "After b = a + [ 13, 17 ]"
print " a =", a
print " b =", b
# Insert an item at a given index (with list slices)
b = a[:2] + [5] + a[2:]
print "After b = a[:2] + [5] + a[2:]"
print " a =", a
print " b =", b
- Removing
Elements
- Destructively (Modifying Lists)
# Create a list
a = [ 2, 3, 5, 3, 7, 5, 11, 13 ]
print "a =", a
# Remove an item with list.remove(item)
a.remove(5)
print "After a.remove(5), a=", a
a.remove(5)
print "After another a.remove(5), a=", a
# Remove an item at a given index with list.pop(index)
item = a.pop(3)
print "After item = a.pop(3)"
print " item =", item
print " a =", a
item = a.pop(3)
print "After another item = a.pop(3)"
print " item =", item
print " a =", a
# Remove last item with list.pop()
item = a.pop()
print "After item = a.pop()"
print " item =", item
print " a =", a
- Non-Destructively (Creating New Lists)
# Create a list
a = [ 2, 3, 5, 7, 11 ]
print "a =", a
# Remove an item at a given index (with list slices)
b = a[:2] + a[3:]
print "After b = a[:2] + a[3:]"
print " a =", a
print " b =", b
- Swapping Elements
# Create a list
a = [ 2, 3, 5, 7 ]
print "a =", a
# Failed swap
a[0] = a[1]
a[1] = a[0]
print "After failed swap of a[0] and a[1]"
print " a=",a
# Reset the list
a = [ 2, 3, 5, 7 ]
print "After resetting the list"
print " a =", a
# Swap with a temp variable
temp = a[0]
a[0] = a[1]
a[1] = temp
print "After swapping a[0] and a[1]"
print " a =", a
# Swap with tuple assignment
a[0],a[1] = a[1],a[0]
print "After swapping a[0] and a[1] again"
print " a =", a
- Looping
over Lists
# Create a list
a = [ 2, 3, 5, 7 ]
print "a =", a
# Looping with: for item in list
print "Here are the items in a:"
for item in a:
print item
# Looping with: for index in range(len(list))
print "And here are the items with their indexes:"
for index in range(len(a)):
print "a[", index, "] =", a[index]
# Looping backward
print "And here are the items in reverse:"
for index in range(len(a)):
revIndex = len(a)-1-index
print "a[", revIndex, "] =", a[revIndex]
- Hazard: Modifying While Looping
# Create a list
a = [ 2, 3, 5, 3, 7 ]
print "a =", a
# Failed attempt to remove all the 3's
for index in range(len(a)):
if (a[index] == 3): # this eventually crashes!
a.pop(index)
print "This line will not run!"
- Comparing
Lists
# Create some lists
a = [ 2, 3, 5, 3, 7 ]
b = [ 2, 3, 5, 3, 7 ] # same as a
c = [ 2, 3, 5, 3, 8 ] # differs in last element
d = [ 2, 3, 5 ] # prefix of a
print "a =", a
print "b =", b
print "c =", c
print "d =", d
print "------------------"
print "a == b", (a == b)
print "a == c", (a == c)
print "a != b", (a != b)
print "a != c", (a != c)
print "------------------"
print "a < c", (a < c)
print "a < d", (a < d)
- Copying
Lists
import copy
# Create a list
a = [ 2, 3, 5, 7, 11 ]
# Try to copy it
b = a # Error! Not a copy, but an alias
c = copy.copy(a) # Ok
# At first, things seem ok
print "At first..."
print " a =", a
print " b =", b
print " c =", c
# Now modify a[0]
a[0] = 42
print "But after a[0] = 42"
print " a =", a
print " b =", b
print " c =", c
- Sorting Lists
- Destructively with list.sort()
a = [ 7, 2, 5, 3, 5, 11, 7 ]
print "At first, a =", a
a.sort()
print "After a.sort(), a =",a
- Non-Destructively with sorted(list)
a = [ 7, 2, 5, 3, 5, 11, 7 ]
print "At first"
print " a =", a
b = sorted(a)
print "After b = sorted(a)"
print " a =", a
print " b =", b
- Using
Lists with Functions
- List
Parameters
- List Parameters Example: countOdds(list)
def countOdds(a):
count = 0
for item in a:
if (item % 2 == 1):
count += 1
return count
print countOdds([2, 3, 7, 8, 21, 23, 24])
- Modifying
list elements is visible to caller: fill(list, value)
def fill(a, value):
for i in range(len(a)):
a[i] = value
a = [1, 2, 3, 4, 5]
print "At first, a =", a
fill(a, 42)
print "After fill(a, 42), a =", a
- Modifying
list reference is not visible to caller
import copy
def destructiveRemoveAll(a, value):
while (value in a):
a.remove(value)
def nonDestructiveRemoveAll(a, value):
a = copy.copy(a)
while (value in a):
a.remove(value)
return a
a = [ 1, 2, 3, 4, 3, 2, 1 ]
print "At first"
print " a =", a
destructiveRemoveAll(a, 2)
print "After destructiveRemoveAll(a, 2)"
print " a =", a
b = nonDestructiveRemoveAll(a, 3)
print "After b = nonDestructiveRemoveAll(a, 3)"
print " a =", a
print " b =", b
- List
Return Types
def numbersWith3s(lo, hi):
result = [ ]
for x in range(lo, hi):
if ("3" in str(x)):
result.append(x)
return result
print numbersWith3s(250, 310)
- Optional
/
Advanced Topics
- Tuples
(Immutable Lists)
- Syntax: (item1, item2)
- Immutability
- Single-Line
Tuple-Swap a,b = b,a
- Lists
and
Functional Programming
- map(function,
list)
- filter(function,list)
- reduce(function,
list)
- List
Comprehensions
- [function(element)
for element in list]
- [function(index,
element) for index, element in enumerate(list)]
- Custom
List Iterators with Generators and yield
- Miscellaneous Topics
- cmp(list1, list2)
- map/reduce with lambda functions
- list.sort(compareFn)
- list.reverse() and reversed(list)
- Safely using list.index(item) with try/except
- Other ways to...
- Remove Items from a List
- list[a:b]
= [ ]
- del
list[a:b]
- Copy a List
- list2 = list1[:]
- list2 = list1 + [ ]
- list2 = list(list1)
- list2 = copy.deepcopy(list1)
- list2 = sorted(list1)
- Suggested
Reading on Lists
- Dive Into Python has a tutorial on lists.
- How to Think Like a Computer
Scientist discusses passing lists as
function arguments.
- Python Library Reference details all
list methods.
- Optional Topic: Python Tutorial explains using
lists as stacks and queues.
- Examples Using Lists
- The Locker Problem
- Anagrams
- Sieve of Eratosthenes and the Prime Counting Function pi(n)
- Suggested Practice Problems
- Replace standard functions: index, count, min, max, sum, copy, sorted, sort, reversed, reverse, ...
- Replace standard operators: equal, greaterThan, ...
- Standard set operations: intersection, union, difference, ...
- Standard vector operations: vectorSum, dotProduct, ....
- Standard statistics: mean, geometricMean, median, stdDev, ...
carpe
diem - carpe
diem - carpe
diem - carpe
diem - carpe
diem - carpe
diem - carpe
diem - carpe
diem - carpe diem