Newbie data structes question
Peter Otten
__peter__ at web.de
Thu Dec 4 09:34:27 EST 2003
Kamus of Kadizhar wrote:
> I have never programmed anyting in python, so this is completely new
> territory. I've programmed in C for so long it's pretty hard wired in
> my brain. I'm trying to break out :-)
>
> I have a program in mind that I think would be a good learning project.
>
> I have a machine that shows movies. There are favorites (most often
> watched movies) that are kept on the machine and archives that are kept
> on an NFS server. There are also new arrivals. All movies (new
> arrivals, favorites, etc) are in the archives.
>
> The machine logs movie names of all movies played. The log file is
> simply a list of movie titles played. If a movie has been played 10
> times, it will appear in the list 10 times.
>
> I want to write a script that will automatically move most watched
> movies into favorites, delete movies that are no longer favorites, and
> replace them with movies that are more frequently watched from archives.
>
> So, I have to create a paired list of some sort:
>
> (movie, count), (movie, count), (movie, count) ....
allmovies = {} # title -> count dictionary
for movie in file("watched.log"):
# remove leading/trailing whitespace
movie = movie.strip()
# count movie
allmovies[movie] = allmovies.get(movie, 0) + 1
# list of (title, freq) tuples
favourites = allmovies.items()
>
> sort the list on the counts, and then loop through from most often
> watched movie not in favorites replacing it in the favorites list with
> the least often watched movie in the favorites list. Stop looping when
> the watch count for both in favorites and not in favorites is the same.
>
# sort descending by frequency
def descFreqCompare(m1, m2):
return cmp(m2[1], m1[1])
favourites.sort(descFreqCompare)
# remove all non-favourites
del favourites[10:]
topten = [movie for movie, freq in favourites]
> If any movies put in to the favorites were in the new arrivals, delete
> from new arrivals.
import sets
# read new arrivals
newarrivals = sets.Set([movie.strip() for movie in file("newarrivals.log")])
newarrivals -= sets.Set(topten)
outstream = file("newarrivals.log", "w")
for movie in newarrivals:
print >> outstream, movie
outstream.close()
>
> So, here's my python question:
Oops, I answered what you didn't ask :-)
>
> What data structures and flow controls are most appropriate? Any neat
> flow control in python?
Let's see - there was a nice for loop, and then we have list comprehensions
which boil down to for loops in [...].
Seriously, most work is done with Python's powerful list/dictionary
implementations. I you already have some programming practice, the Python
tutorial at http://www.python.org/doc/current/tut/tut.html is a good
starting point. This together with the library documentation and perhaps
Alex Martelli's "Python in a Nutshell" is all you need to actually write
most of the programs you only dreamed of writing in C.
Peter
More information about the Python-list
mailing list