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

Reply via email to