totally lost newbie

Marc 'BlackJack' Rintsch bj_666 at gmx.net
Sun May 27 06:51:57 EDT 2007


In <1180261154.969654.147850 at n15g2000prd.googlegroups.com>, mark wrote:

> Hi all
> 
> I posted earlier on this but have changed my approach so here is my
> latest attempt at solving a problem. I have been working on this for
> around 12 hours straight and am still struggling with it.
> 
> Write a program that reads the values for a random list of cards from
> a file, where each line in the file specifies a single card with the
> rank and then the suit separated by a space. The rank should be an
> integer in the range of 1 to 13 (Ace:1, King:13), while the suit
> should be a lower case character in the set { 'h', 'd', 'c', 's' }.
> Sort the card entries into suits ordered by rank, and print out the
> ordered list. Hint: sort the list first by rank, and then by suit.
> 
> The format of the cards.txt file is;
> 
> 1 h
> 1 d
> 13 c
> 10 s
> 
> and so on for the whole deck.
> 
> Can someone help me to get the mycomp function to work.
> 
> Any help appreciated
> 
> J
> 
> def read_cards(filename):
> 
>     cards = []
>     for card in open(filename, 'r'):
>         # strip the trailing newline character
>         cards.append(card.strip())
>     return cards
> 
> filename = 'cards.txt'
> cards = read_cards(filename)
> 
> 
> 
> def cards_str2tup(cards):
> 
>     cards_tup = []
>     for card in cards:
>         rank, suit = card.split()
>         cards_tup.append((suit, int(rank)))
>     return cards_tup
> 
> def cards_tup2str(cards_tup):
> 
>     cards = []
>     space = ' '
>     for tup in cards_tup:
>         suit, rank = tup
>         s = str(rank) + space + suit
>         cards.append(s)
>     return cards
> 
> def mycmp( a, b):
>     #define the order in which the characters are to be sorted
>     order = [ 'h', 'd', 'c', 's' ]
>     # if the characters from each element ARENT the same
>     if a[1] <> b[1]:
>         #return the result of comparing the index of each elements
> character in the order list
>         return cmp( order.index( a[1] ), order.index( b[1] ) )
>     #otherwise
>     else :
>         #return the result of comparing each elements number
>         return cmp( a[0], b[0] )
> 
> cards.sort( mycmp )
> #print cards

Maybe it's easier to use a key function instead of a compare function.  A
key function receives an element and must return something that is then
sorted and the element ends up where the computed key is in the sorted
list.  Little example for sorting a list of strings first by length and
strings of the same length by alphabetical order:

def key_func(item):
    return (len(item), item)

data = ['viking', 'spam', 'parrot', 'ham', 'eric']
data.sort(key=key_func)
print data

Ciao,
	Marc 'BlackJack' Rintsch



More information about the Python-list mailing list