On May 27, 12:19 pm, mark <[EMAIL PROTECTED]> 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
You need to exploit the lexicographic order as in the following function. def sort_carddeck(card_deck_pairs): # card deck pairs have to be a list of # the form [(rank1, suit1), (rank1, suit2),...] suit_order = [ 'h', 'd', 'c', 's' ] def cmp(p1, p2): i1 = suit_order.index(p1[1]) i2 = suit_order.index(p2[1]) if i1<i2: return -1 elif i1 == i2: if int(p1[0])<=int(p2[0]): return -1 else: return 1 else: return 1 return sorted(card_deck_pairs, cmp) -- http://mail.python.org/mailman/listinfo/python-list