Last modified on 18 September 2012, at 23:06

How to Think Like a Computer Scientist: Learning with Python 2nd Edition/Solutions/CH 10

Chapter 10Edit

CH 10 - Solution 1Edit

CH 10 - Solution 1.1Edit

>>> import calendar
>>> year = calendar.calendar(2008)
>>> print year
                                  2008
 
      January                   February                   March
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6                   1  2  3                      1  2
 7  8  9 10 11 12 13       4  5  6  7  8  9 10       3  4  5  6  7  8  9
14 15 16 17 18 19 20      11 12 13 14 15 16 17      10 11 12 13 14 15 16
21 22 23 24 25 26 27      18 19 20 21 22 23 24      17 18 19 20 21 22 23
28 29 30 31               25 26 27 28 29            24 25 26 27 28 29 30
                                                    31
 
       April                      May                       June
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6                1  2  3  4                         1
 7  8  9 10 11 12 13       5  6  7  8  9 10 11       2  3  4  5  6  7  8
14 15 16 17 18 19 20      12 13 14 15 16 17 18       9 10 11 12 13 14 15
21 22 23 24 25 26 27      19 20 21 22 23 24 25      16 17 18 19 20 21 22
28 29 30                  26 27 28 29 30 31         23 24 25 26 27 28 29
                                                    30
 
        July                     August                  September
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
    1  2  3  4  5  6                   1  2  3       1  2  3  4  5  6  7
 7  8  9 10 11 12 13       4  5  6  7  8  9 10       8  9 10 11 12 13 14
14 15 16 17 18 19 20      11 12 13 14 15 16 17      15 16 17 18 19 20 21
21 22 23 24 25 26 27      18 19 20 21 22 23 24      22 23 24 25 26 27 28
28 29 30 31               25 26 27 28 29 30 31      29 30
 
      October                   November                  December
Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su      Mo Tu We Th Fr Sa Su
       1  2  3  4  5                      1  2       1  2  3  4  5  6  7
 6  7  8  9 10 11 12       3  4  5  6  7  8  9       8  9 10 11 12 13 14
13 14 15 16 17 18 19      10 11 12 13 14 15 16      15 16 17 18 19 20 21
20 21 22 23 24 25 26      17 18 19 20 21 22 23      22 23 24 25 26 27 28
27 28 29 30 31            24 25 26 27 28 29 30      29 30 31
 
>>>


CH 10 - Solution 1.2Edit

isleap(year) - Return 1 for leap years, 0 for non-leap years.


>>> from calendar import *
>>> isleap(2008)
True
>>> isleap(2009)
False
>>>

CH 10 - Solution 2Edit

CH 10 - Solution 2.1Edit

 python C:\Python26\Lib\pydoc.py -p 7464 

CH 10 - Solution 2.2Edit

There are 35 functions in the math module.

CH 10 - Solution 2.3Edit

The floor function finds the greatest integral value less than or equal to x. The ceil function finds the lowest integeral value greater than or equal to x.

CH 10 - Solution 2.4Edit

CH 10 - Solution 2.5Edit

The two data constants in the math module are: 'e' and 'pi'.

CH 10 - Solution 3Edit

"""
Interface summary:
 
        import copy
 
        x = copy.copy(y)        # make a shallow copy of y
        x = copy.deepcopy(y)    # make a deep copy of y
 
For module specific errors, copy.Error is raised.
 
The difference between shallow and deep copying is only relevant for
compound objects (objects that contain other objects, like lists or
class instances).
 
- A shallow copy constructs a new compound object and then (to the
  extent possible) inserts *the same objects* into it that the
  original contains.
 
- A deep copy constructs a new compound object and then, recursively,
  inserts *copies* into it of the objects found in the original."""

deepcopy would have come handy in exercises you didn't have to solve regarding object reference, thus no answer is excpected here.

CH 10 - Solution 4Edit

CH 10 - Solution 5Edit

CH 10 - Solution 6Edit

Namespaces are one honking great idea -- let's do more of those!

CH 10 - Solution 7Edit

CH 10 - Solution 8Edit

def matrix_mult(m1, m2):

  """
     >>> matrix_mult([[1, 2], [3,  4]], [[5, 6], [7, 8]])
     [[19, 22], [43, 50]]
     >>> matrix_mult([[1, 2, 3], [4,  5, 6]], [[7, 8], [9, 1], [2, 3]])
     [[31, 19], [85, 55]]
     >>> matrix_mult([[7, 8], [9, 1], [2, 3]], [[1, 2, 3], [4, 5, 6]])
     [[39, 54, 69], [13, 23, 33], [14, 19, 24]]
   """
  
  qr = len(m1)
  qc = len(m2[0])
  NewMtx = []
  for row in range(qr):
      newRow = []
      for column in range(qc):
          newRow.append(row_times_column(m1, row, m2, column))
      NewMtx.append(newRow)
  return NewMtx

return NewMtx

     qr = len(m1)
  qc = len(m2[0])
  NewMtx = []
  for row in range(qr):
      newRow = []
      for column in range(qc):
          newRow.append(row_times_column(m1, row, m2, column))
      NewMtx.append(newRow)

CH 10 - Solution 9Edit

CH 10 - Solution 10Edit

def myreplace(old, new, s):
    """
    Replace all occurences of old with new in the string s.
 
      >>> myreplace(',', ';', 'this, that, and, some, other, thing')
      'this; that; and; some; other; thing'
      >>> myreplace(' ', '**', 'Words will now be separated by stars.')
      'Words**will**now**be**separated**by**stars.'
 
    """
    old_removed = s.split(old)
    new_added = new.join(old_removed)
    return new_added
# Shorter version
#    new_added = new.join(s.split(old))

CH 10 - Solution 11Edit

def cleanword(word):
    """
      >>> cleanword('what?')
      'what'
      >>> cleanword('"now!"')
      'now'
      >>> cleanword('?+="word!,@$()"')
      'word'
    """
    cleaned_word = ''
    for i in range(len(word)):
        char = word[i]
        if char.isalpha():
            cleaned_word += char
    return cleaned_word
 
 
def has_dashdash(s):
    """
      >>> has_dashdash('distance--but')
      True
      >>> has_dashdash('several')
      False
      >>> has_dashdash('critters')
      False
      >>> has_dashdash('spoke--fancy')
      True
      >>> has_dashdash('yo-yo')
      False
    """
    return s.find('--') != -1
 
 
def extract_words(s):
    """
      >>> extract_words('Now is the time!  "Now", is the time? Yes, now.')
      ['now', 'is', 'the', 'time', 'now', 'is', 'the', 'time', 'yes', 'now']
      >>> extract_words('she tried to curtsey as she spoke--fancy')
      ['she', 'tried', 'to', 'curtsey', 'as', 'she', 'spoke', 'fancy']
    """
    if has_dashdash(s):
        s = myreplace('--', ' ', s) #using myreplace function from Q. 10
    words_punc = s.split()
    cleanlist = []
    for word in words_punc:
        cleanedword = cleanword(word).lower()
        cleanlist.append(cleanedword)
    return cleanlist
 
 
def wordcount(word, wordlist):
    """
      >>> wordcount('now', ['now', 'is', 'time', 'is', 'now', 'is', 'is'])
      ['now', 2]
      >>> wordcount('is', ['now', 'is', 'time', 'is', 'now', 'is', 'the', 'is'])
      ['is', 4]
      >>> wordcount('time', ['now', 'is', 'time', 'is', 'now', 'is', 'is'])
      ['time', 1]
      >>> wordcount('frog', ['now', 'is', 'time', 'is', 'now', 'is', 'is'])
      ['frog', 0]
    """
 
    return [word, wordlist.count(word)]
 
 
def wordset(wordlist):
    """
      >>> wordset(['now', 'is', 'time', 'is', 'now', 'is', 'is'])
      ['is', 'now', 'time']
      >>> wordset(['I', 'a', 'a', 'is', 'a', 'is', 'I', 'am'])
      ['I', 'a', 'am', 'is']
      >>> wordset(['or', 'a', 'am', 'is', 'are', 'be', 'but', 'am'])
      ['a', 'am', 'are', 'be', 'but', 'is', 'or']
    """
 
    for word in wordlist:
        count = wordcount(word, wordlist)[1]
        if count > 1:
            for a in range(count - 1):
                wordlist.remove(word)
    wordlist.sort()
    return wordlist
 
 
def longestword(wordset):
    """
      >>> longestword(['a', 'apple', 'pear', 'grape'])
      5
      >>> longestword(['a', 'am', 'I', 'be'])
      2
      >>> longestword(['this', 'that', 'supercalifragilisticexpialidocious'])
      34
    """
    longest = 0
    for word in wordset:
        length = len(word)
        if length > longest:
            longest = length
    return longest
 
 
if __name__ == '__main__':
    import doctest
    doctest.testmod()

CH 10 - Solution 12Edit

#sort_fruits.py
 
source = open('unsorted_fruits.txt', 'r')
fruits = source.readlines()
source.close()
fruits.sort()
newfile = open('sorted_fruits.txt', 'w')
newfile.writelines(fruits)
newfile.close()

CH 10 - Solution 13Edit

CH 10 - Solution 14Edit

#mean.py
 
from sys import argv
 
nums = argv[1:]
 
for i, value in enumerate(nums):
    nums[i] = float(value)
 
mean = sum(nums) / len(nums)
 
print mean

CH 10 - Solution 15Edit

#median.py
 
from sys import argv
nums = argv[1:]
 
for i, value in enumerate(nums):
    nums[i] = float(value)
 
nums.sort()
size = len(nums)
middle = size / 2
 
if size % 2 == 0:
    median = (nums[middle - 1] + nums[middle]) / 2
else:
    median = nums[middle]
 
if median == float(int(median)):
    median = int(median)
 
print median

CH 10 - Solution 16Edit

#
# countletters.py
#
 
def display(i):
    if i == 10: return 'LF'
    if i == 13: return 'CR'
    if i == 32: return 'SPACE'
    return chr(i)
 
from sys import argv
 
filename = argv[1]
 
infile = open(filename, 'r')
text = infile.read()
infile.close()
 
counts = 128 * [0]
 
for letter in text:
    counts[ord(letter)] += 1
 
filenamesplit = filename.split('.') # splits 'name.txt' -> ['name', 'txt']
count_file = filenamesplit[0] + '_counts.dat' # 'name' -> 'name_counts.dat'
 
outfile = open(count_file, 'w')
outfile.write("%-12s%s\n" % ("Character", "Count"))
outfile.write("=================\n")
 
for i in range(len(counts)):
    if counts[i]:
        outfile.write("%-12s%d\n" % (display(i), counts[i]))
 
outfile.close()