2

i've been trying to get the sum of list that changed its values from a string to int using a function

player_hand = [] 

def card_type(player_hand):
 card_value = 0
 if player_hand[0] == 'A':
     card_value = 11
 if player_hand[0] == 'J':
     card_value = 10
 if player_hand[0] == 'Q':
     card_value = 10
 if player_hand[0] == 'K':
     card_value = 10

 if player_hand[0] == '2':
     card_value = 2
 if player_hand[0] == '3':
     card_value = 3
 if player_hand[0] == '4':
     card_value = 4
 if player_hand[0] == '5':
     card_value = 5
 if player_hand[0] == '6':
     card_value = 6
 if player_hand[0] == '7':
     card_value = 7
 if player_hand[0] == '8':
     card_value = 8
 if player_hand[0] == '9':
     card_value = 9
 if player_hand[0] == '1':
     card_value = 10

def player_hit(card_deck):
 rando = random.randint(0,len(card_deck)-1)
 player_hand.append(card_deck[rando])
 card_deck.remove(card_deck[rando])

and then try to find the sum of the player list using

card_total = 0

print('Player was handed:')
for i in range(2):
    print(player_hit(card_deck))

for i in len(player_hand)-1:
    print('\n',sum(card_type(player_hand[i])))

however i get an error

for i in len(player_hand)-1:
TypeError: 'int' object is not iterable

i don't understand what the problem is because ive taken the values and converted them into int's already as well as checked the list index range. Please help

2 Answers 2

7

len(player_hand) - 1 is just an integer, but the code you've written tries to loop over it. You need an iterable object to perform a for loop. Try this:

 for i in range(len(player_hand)):
     # do your thing here

An alternative would be iterating directly over player_hand since it is iterable, just like this:

 for card in player_hand:
     print('\n', card_type(card))
Sign up to request clarification or add additional context in comments.

2 Comments

This correctly diagnoses the error. The questioner should note however that the card_type function expects a sequence of characters (a "hand") rather than a single character that you're passing. This will actually work, since even a single character string is a sequence type, but it suggests that the design is a bit messed up (probably card_type should expect a single card as its argument and skip the [0] indexing). Also, player_hit returns None (since there are no return statements), but you're printing the result.
@Blckknght you are correct, maybe you should post as answer as well.
-1

Here is an object-oriented version which may be easier to work with:

from random import shuffle

card_value = {
    "A": 11,    "J": 10,    "Q": 10,    "K": 10,    "1": 10,
    "9": 9,     "8": 8,     "7": 7,     "6": 6,     "5": 5,
    "4": 4,     "3": 3,     "2": 2
}

class Deck:
    def __init__(self):
        self.d = list(card_value) * 4
        shuffle(self.d)

    def hit(self):
        return self.d.pop()

class Player:
    def __init__(self, name):
        self.name = name
        self.hand = []

    def hit(self, deck, num=1):
        for i in range(num):
            self.hand.append(deck.hit())

    def hand_value(self):
        return sum(card_value[card] for card in self.hand)

    def __str__(self):
        return "{}: {} ({} points)".format(self.name, "".join(self.hand), self.hand_value())

def main():
    print("Fresh deck!")
    deck = Deck()
    # deal 3 cards to player 1 and show the result
    p1 = Player("Charles")
    p1.hit(deck, 3)
    print(p1)        # Charles: Q96 (25 points)

if __name__ == "__main__":
    main()

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.