2017-02-15 4 views
0

Нижеприведенная обработка предназначена для анализа переменной dealList для заполнения 4 словарей SHD и C. Я думаю, что проблема заключается в предпоследней строке кода, в котором я использую eval(suit), где находятся костюмы зациклился.Есть ли альтернатива eval для этого кода

Все костюмы SHD и C инициализируются как пустые словари, но в конечном итоге должны содержать 13 предметов словаря, по одному для каждой карты в костюме.

Я подозреваю, что происходит каждый раз, когда выполняется eval (костюм), он находит словарь для обработки, но не сохраняет имя словаря, поэтому нужный именованный словарь не обновляется. Иначе говоря, похоже, что я повторяю цикл, используя букву S, взятую из списка, но эта буква также называет словарь. Но я не знаю, как сказать python, что эти два связаны.

Что мне нужно использовать вместо eval(), или в дополнение к eval() для достижения моей цели?

keys = list('23456789TJQKA') 
values = range (13) 
suitDict = {} 
for key,value in zip(keys, values): 
    suitDict[key] = value 
dealList = 'AQJT5.KQ.8.KQT95 3.A765.QT743.843 974.T93.J92.AJ62 K862.J842.AK65.7'.split() 
players = list('NESW') 
suits = list('SHDC') 
S = H = D = C = {} 
playerHand ={} 
for player,hand in zip(players,dealList): 
    playerHand[player]=hand 
    print player,hand 
    for suit,cards in zip(suits,playerHand[player].split('.')): 
     print "SC:",suit,cards 
     for card in cards: 
      eval(suit)[suitDict[card]]= player 
      print "card",card,"Suit",suit,"X",eval(suit),"card",suitDict[card],"player",player  

Возможно, распечатка результатов покажет проблему. Обратите внимание, что в приведенном ниже примере выборки первые 5 карт - это пики, а следующие две карты - это сердца, K и Q сердец, чтобы быть конкретными. Но словарь словарей изменяется, а не словарь сердец. Это отсутствие изменения массива, который обновляется, продолжается вечно.

N AQJT5.KQ.8.KQT95 
SC: S AQJT5 
card A Suit S X [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 'N'] card 12 player N 
card Q Suit S X [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'N', 11, 'N'] card 10 player N 
card J Suit S X [0, 1, 2, 3, 4, 5, 6, 7, 8, 'N', 'N', 11, 'N'] card 9 player N 
card T Suit S X [0, 1, 2, 3, 4, 5, 6, 7, 'N', 'N', 'N', 11, 'N'] card 8 player N 
card 5 Suit S X [0, 1, 2, 'N', 4, 5, 6, 7, 'N', 'N', 'N', 11, 'N'] card 3 player N 
SC: H KQ 
card K Suit H X [0, 1, 2, 'N', 4, 5, 6, 7, 'N', 'N', 'N', 'N', 'N'] card 11 player N 
card Q Suit H X [0, 1, 2, 'N', 4, 5, 6, 7, 'N', 'N', 'N', 'N', 'N'] card 10 player N 
SC: D 8 
card 8 Suit D X [0, 1, 2, 'N', 4, 5, 'N', 7, 'N', 'N', 'N', 'N', 'N'] card 6 player N 
SC: C KQT95 
card K Suit C X [0, 1, 2, 'N', 4, 5, 'N', 7, 'N', 'N', 'N', 'N', 'N'] card 11 player N 
card Q Suit C X [0, 1, 2, 'N', 4, 5, 'N', 7, 'N', 'N', 'N', 'N', 'N'] card 10 player N 
card T Suit C X [0, 1, 2, 'N', 4, 5, 'N', 7, 'N', 'N', 'N', 'N', 'N'] card 8 player N 
card 9 Suit C X [0, 1, 2, 'N', 4, 5, 'N', 'N', 'N', 'N', 'N', 'N', 'N'] card 7 player N 
card 5 Suit C X [0, 1, 2, 'N', 4, 5, 'N', 'N', 'N', 'N', 'N', 'N', 'N'] card 3 player N 
E 3.A765.QT743.843 
SC: S 3 
card 3 Suit S X [0, 'E', 2, 'N', 4, 5, 'N', 'N', 'N', 'N', 'N', 'N', 'N'] card 1 player E 
SC: H A765 
card A Suit H X [0, 'E', 2, 'N', 4, 5, 'N', 'N', 'N', 'N', 'N', 'N', 'E'] card 12 player E 
card 7 Suit H X [0, 'E', 2, 'N', 4, 'E', 'N', 'N', 'N', 'N', 'N', 'N', 'E'] card 5 player E 
card 6 Suit H X [0, 'E', 2, 'N', 'E', 'E', 'N', 'N', 'N', 'N', 'N', 'N', 'E'] card 4 player E 
card 5 Suit H X [0, 'E', 2, 'E', 'E', 'E', 'N', 'N', 'N', 'N', 'N', 'N', 'E'] card 3 player E 
SC: D QT743 
card Q Suit D X [0, 'E', 2, 'E', 'E', 'E', 'N', 'N', 'N', 'N', 'E', 'N', 'E'] card 10 player E 
card T Suit D X [0, 'E', 2, 'E', 'E', 'E', 'N', 'N', 'E', 'N', 'E', 'N', 'E'] card 8 player E 
card 7 Suit D X [0, 'E', 2, 'E', 'E', 'E', 'N', 'N', 'E', 'N', 'E', 'N', 'E'] card 5 player E 
card 4 Suit D X [0, 'E', 'E', 'E', 'E', 'E', 'N', 'N', 'E', 'N', 'E', 'N', 'E'] card 2 player E 
card 3 Suit D X [0, 'E', 'E', 'E', 'E', 'E', 'N', 'N', 'E', 'N', 'E', 'N', 'E'] card 1 player E 
SC: C 843 
card 8 Suit C X [0, 'E', 'E', 'E', 'E', 'E', 'E', 'N', 'E', 'N', 'E', 'N', 'E'] card 6 player E 
card 4 Suit C X [0, 'E', 'E', 'E', 'E', 'E', 'E', 'N', 'E', 'N', 'E', 'N', 'E'] card 2 player E 
card 3 Suit C X [0, 'E', 'E', 'E', 'E', 'E', 'E', 'N', 'E', 'N', 'E', 'N', 'E'] card 1 player E 
+1

Я не уверен, если это является причиной вашей проблемы , но 'S = H = D = C = {}' почти наверняка не делает то, что вы хотите. Это делает все эти имена ссылками на один и тот же словарь. Я предполагаю, что вы хотите, чтобы они были отдельными словарями. – Blckknght

+0

Это точно проблема. – zerowords

ответ

1

Вашего код странность в основном обусловлена ​​тем фактом, что все ваши костюмы словари (S, H, D и C) ссылаются на тот же словарь. Вы должны их инициализировать отдельно, если хотите, чтобы они указывали на другую ссылку (например, S, H, D, C = {}, {}, {}, {}).

Это, как говорится, eval (почти) никогда не будет решением. В вашем случае, я бы что-то вроде:

keys = list('23456789TJQKA') 
values = range (13) 
suitDict = {} 
for key,value in zip(keys, values): 
    suitDict[key] = value 
dealList = 'AQJT5.KQ.8.KQT95 3.A765.QT743.843 974.T93.J92.AJ62 K862.J842.AK65.7'.split() 
players = list('NESW') 
suits = {"S": {}, "H": {}, "D": {}, "C": {}} 
playerHand = {} 
for player,hand in zip(players,dealList): 
    playerHand[player] = hand 
    print player,hand 
     for suit,cards in zip(suits,playerHand[player].split('.')): 
      print "SC:",suit,cards 
      for card in cards: 
       suits[suit][suitDict[card]] = player 
       print "card",card,"Suit",suit,"X",suits[suit],"card",suitDict[card],"player",player 

Это сказанное, я думаю, что вы чрезмерно усложнять свое дело ...

+0

Вам не нужны _suits.keys() _ под _zip_ - просто _suite_ будет делать. Большинство итерационных модификаторов - например, _sorted_, _list_, _set_ и т. Д. - обрабатывают словарные ключи под капотом. В Python 2. * _keys() _ будет производить промежуточный список; в Python 3. * это просто избыточный код. – volcano

+0

Правда, что. Я удалил избыточность. – zwer

+0

Да. Мне потребовалось некоторое время, чтобы увидеть, что вы заменили 'eval()', что желательно. Вы имеете в виду, что еще одна альтернатива упростит это? Например, я рассматриваю определение suits SHD & C как диапазона (13), (списки, а не dicts) и использование suitDict [card], которое является целым индексом в списках костюмов в моем 'eval()' процессе. Если я это сделаю, я думаю, что мне нужно вернуться к моему первоначальному процессу 'eval()', но это работает, чтобы сделать SHD & C в списки, что мне нравится. Комментарии? – zerowords

Смежные вопросы