2016-01-31 3 views
2

Я пытаюсь создать колоду карт в python, но я пытаюсь сохранить всю информацию в словаре. Мне нужно сохранить имя карты (т. Е. 2, 4, «K» для короля, «J» для разъема и т. Д.), Значение, которое карта стоит в черном гнезде (т. Е. 2 ​​стоит 2, «A» для туза стоит 1 или 11 в зависимости от сценария) и номер этой конкретной карты, оставшейся в колоде. Однако, когда я пишу свой код на Python, я понимаю, что все значения карт равны 8. Теперь я знаю, что что-то не так, но я новичок в python, и я пытаюсь понять, почему я даю такие разрушительные результаты.Итерация через dict в python не дает желаемых результатов

Пример кода:

class Card(object): 

    def __init__(self, list): 
     self.deck_list = list 
     self.construct_deck() 

    def construct_deck(self): 
     #Here we created a dictionary from the list keys 
     self.deck = dict.fromkeys(self.deck_list, {'total': 4, 'value': 0}) 
     self.keys = self.deck.keys() 

     for key in self.keys: 
      try: 
       value = int(key) 

      except: 

       if key != 'A': 
        value = 10 
       else: 
        value = [1,11] 

      finally: 
       self.deck[key]['value'] = value 


    def shuffle_deck(self): 
     pass 

l = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] 

bj = Card(l) 

print bj.deck 

код должен выполнить следующие действия:

  • Если ключ был в состоянии быть превращена в междунар то оно должно быть 2-10, а значение, то установить на целочисленную версию ключа
  • Однако, если блок try не прошел, значение должно быть символом. Стоимость всех симпатичных карт (jack, king и queen) составляет десять, поэтому, если ключ является либо «J», «K», либо «Q», значение должно быть установлено равным десяти, другое должно быть установлено на список [1,11]. Наконец, наконец, нужно присвоить значение значению, соответствующему этому ключу

ответ

0

Проблема заключается ваше использование dict.fromkeys() со значением Словаря в качестве значения по умолчанию. Это устанавливает тот же словарь как значение для всех ключей, поэтому, если вы его обновите, все они обновляются.

Лучшим решением было бы установить пустой dict, а затем просто перебрать через deck_list. (Также обратите внимание, что self.keys - это то же самое, что и self.deck_list;

Кроме того, вы всегда должны избегать пустых за исключением; уловите ошибки, которые вы ожидаете, что в данном случае является только ValueError. Также это не очень полезно использовать finally; просто удалите это и заблокируйте блок.

self.deck = {} 

for key in self.deck_list: 

    try: 
     value = int(key) 
    except ValueError: 
     if key == 'A': 
      value = [1,11] 
     else: 
      value = 10 

    self.deck[key] = {'total': 4, 'value': value} 
+0

Большое спасибо за помощь. Я видел, где я ошибся, и проблема решена –

0

Ваш первоначальный оператор «fromkeys» устанавливает все значения в один и тот же объект dict. Вы можете продемонстрировать это:

print bj.deck['3'] is bj.deck['4'] 
# prints True 

Поскольку значения все ссылки на то же Словаре, окончательный ключ разбора, «8», становится «значение» для Dict.

Вы можете исправить это путем создания отдельного Dict для каждого ключа:

self.deck = dict([(k, {'total': 4, 'value': 0}) 
       for k in self.deck_list])