2016-02-16 4 views
-1

Когда я печатаю объект класса PlyingCard, он правильно возвращает строку (например, Десять Diamonds), но когда я читаю данные из файла (текстовый файл: 9 d \ n7 d) и добавляю его в список как объекты этого класса, но если я хочу, чтобы напечатать элемент этого списка показывает:Почему один раз он работает, а другой дает ошибку типа?

Traceback (most recent call last): File

"C:/Python34/Zadanka/r10/r10_z11.py", line 51, in
main() File "C:/Python34/Zadanka/r10/r10_z11.py", line 50, in main
print(card[0]) # TypeError: list indices must be integers, not str File "C:/Python34/Zadanka/r10/r10_z11.py", line 28, in str

return str(self.ranks[self.rank] + " of " + self.suits[self.suit])

TypeError: list indices must be integers, not str.

class PlayingCard: 

    def __init__(self, rank, suit): 
     self.rank = rank 
     self.suit = suit 
     self.ranks = [None, "Ace", "Two", "Three", "Four", "Five", "Six", 
         "Seven", "Eight", "Nine", "Ten", "Jack", "Queen", "King"] 
     self.suits = {"s":"Spades", 
         "d":"Diamonds", 
         "c":"Clubs", 
         "h":"Hearts"} 

    def getRank(self): 
     return self.rank 

    def getSuit(self): 
     return self.suit 

    def BJValue(self): 
     BJVal = 0 
     if 11 > self.rank > 0: 
      BJVal = self.rank 
     elif 14 > self.rank > 10: 
      BJVal = 10 
     return BJVal 

    def __str__(self): 
     return str(self.ranks[self.rank] + " of " + self.suits[self.suit]) 

def readCard(filename): 
    infile = open(filename, 'r') 
    cards = [] 
    for line in infile: 
     cards.append(makeCard(line)) 
    infile.close() 
    return cards 

def makeCard(infoStr): 
    rank, suit = infoStr.split() 
    return PlayingCard(rank, suit) 

def main(): 
    filename = "C:\\Python34\\Zadanka\\r11\\cards.txt" 

    a = PlayingCard(10, "d") 
    print(a) # Ten of Diamonds 

    cards = readCard(filename) 
    print(cards[0]) # TypeError: list indices must be integers, not str 
main() 
+0

'self.ranks' список и вы индексировать его с помощью строки,' self.rank'. Вам нужно использовать целое число. –

ответ

2

в вашем makeCard методе вы принимаете линию чтения из файла и раскалывают его, раскол будет разбит на две строки для линии считая не целое число и строку.

Я думаю, что следующий должен сделать трюк

return PlayingCard(int(rank), suit) 
Смежные вопросы