Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > totally lost newbie

Reply
Thread Tools

totally lost newbie

 
 
mark
Guest
Posts: n/a
 
      05-27-2007
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

 
Reply With Quote
 
 
 
 
Gabriel Genellina
Guest
Posts: n/a
 
      05-27-2007
En Sun, 27 May 2007 07:19:15 -0300, mark <(E-Mail Removed)> escribió:

> 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.


Almost done. Just two things:
- You have defined a function to convert the file format into tuples. But
you are not consistent with the ordering: in the file they come
rank+space+suit. When you convert to tuple you use (suit,rank). Inside the
comparison function you use a[0] as rank and a[1] as suit again. Be
consistent.
- The sort expects a list of tuples, but you still use the lines read from
the file; you forgot to call the function above to convert them.

--
Gabriel Genellina

 
Reply With Quote
 
 
 
 
Marc 'BlackJack' Rintsch
Guest
Posts: n/a
 
      05-27-2007
In <(E-Mail Removed) .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
 
Reply With Quote
 
Kay Schluehr
Guest
Posts: n/a
 
      05-27-2007
On May 27, 12:19 pm, mark <(E-Mail Removed)> 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)


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
Re: totally lost newbie Steve Howell Python 1 05-27-2007 02:42 PM
Re: totally lost newbie Steve Howell Python 0 05-27-2007 02:21 PM
Update SQL database from form - newbie and totally lost! guardsman85 ASP .Net 2 08-29-2006 03:08 AM
stl errors - totally lost karthik kumar C++ 8 12-03-2004 01:33 PM
my button died and I'm totally lost Steve ASP .Net 10 01-13-2004 04:03 PM



Advertisments