text: #!/usr/bin/python -tt
  # Copyright 2010 Google Inc.
  # Licensed under the Apache License, Version 2.0
  # http://www.apache.org/licenses/LICENSE-2.0
  
  # Google's Python Class
  # http://code.google.com/edu/languages/google-python-class/
  
  # Basic list exercises
  # Fill in the code for the functions below. main() is already set up
  # to call the functions with a few different inputs,
  # printing 'OK' when each function is correct.
  # The starter code for each function includes a 'return'
  # which is just a placeholder for your code.
  # It's ok if you do not complete all the functions, and there
  # are some additional functions to try in list2.py.
  
  # A. match_ends
  # Given a list of strings, return the count of the number of
  # strings where the string length is 2 or more and the first
  # and last chars of the string are the same.
  # Note: python does not have a ++ operator, but += works.
  def match_ends(words):
    count = 0
    MIN_LEN = 2
    for str_frag in words:
      if len(str_frag) >= MIN_LEN :
        if str_frag[0] == str_frag[-1] :
          count += 1	
    return count
  
  
  # B. front_x
  # Given a list of strings, return a list with the strings
  # in sorted order, except group all the strings that begin with 'x' first.
  # e.g. ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] yields
  # ['xanadu', 'xyz', 'aardvark', 'apple', 'mix']
  # Hint: this can be done by making 2 lists and sorting each of them
  # before combining them.
  def front_x(words):
    x_list = []
    X_STR = 'x'
    # Copy all the entries starting with x into a separate list.
    for str_frag in words:
      if str_frag.startswith(X_STR) :
        x_list.append(str_frag)
    # Remove the x words from the original list
    if len(x_list) > 0 :
      for str_frag in x_list :
        words.remove(str_frag)
      # Sort both lists alphabetically
      x_list.sort()
      words.sort()
    return x_list + words
  
  
  
  # C. sort_last
  # Given a list of non-empty tuples, return a list sorted in increasing
  # order by the last element in each tuple.
  # e.g. [(1, 7), (1, 3), (3, 4, 5), (2, 2)] yields
  # [(2, 2), (1, 3), (3, 4, 5), (1, 7)]
  # Hint: use a custom key= function to extract the last element form each tuple.
  def sort_last(tuples):
    return sorted(tuples, key=getKey)
   
  def getKey(item):
    return item[-1]
  
  
  # Simple provided test() function used in main() to print
  # what each function returns vs. what it's supposed to return.
  def test(got, expected):
    if got == expected:
      prefix = ' OK '
    else:
      prefix = '  X '
    print('%s got: %s expected: %s' % (prefix, repr(got), repr(expected)))
  
  
  # Calls the above functions with interesting inputs.
  def main():
    print ('match_ends')
    test(match_ends(['aba', 'xyz', 'aa', 'x', 'bbb']), 3)
    test(match_ends(['', 'x', 'xy', 'xyx', 'xx']), 2)
    test(match_ends(['aaa', 'be', 'abc', 'hello']), 1)
  
    print
    print ('front_x')
    test(front_x(['bbb', 'ccc', 'axx', 'xzz', 'xaa']),
         ['xaa', 'xzz', 'axx', 'bbb', 'ccc'])
    test(front_x(['ccc', 'bbb', 'aaa', 'xcc', 'xaa']),
         ['xaa', 'xcc', 'aaa', 'bbb', 'ccc'])
    test(front_x(['mix', 'xyz', 'apple', 'xanadu', 'aardvark']),
         ['xanadu', 'xyz', 'aardvark', 'apple', 'mix'])
  
         
    print
    print( 'sort_last')
    test(sort_last([(1, 3), (3, 2), (2, 1)]),
         [(2, 1), (3, 2), (1, 3)])
    test(sort_last([(2, 3), (1, 2), (3, 1)]),
         [(3, 1), (1, 2), (2, 3)])
    test(sort_last([(1, 7), (1, 3), (3, 4, 5), (2, 2)]),
         [(2, 2), (1, 3), (3, 4, 5), (1, 7)])
  
  
  if __name__ == '__main__':
    main()
  