2017-02-15 2 views
0

Die Verarbeitung unten ist dazu bestimmt, die Variable dealList zu 4 Wörterbücher SHD und C bevölkern. Ich denke, das Problem ist in der vorletzten Zeile des Codes, in dem ich eval(suit) wo Anzüge sind durchgeschleift.Gibt es eine Alternative zu Eval für diesen Code

Alle Anzüge SHD und C werden als leere Wörterbücher initialisiert, sollen aber letztendlich 13 Wörterbuchelemente enthalten, eines für jede Karte in ihrer Farbe.

Ich vermute, was passiert ist, dass jedes Mal eval (suit) ausgeführt wird, findet es ein Wörterbuch zu verarbeiten, aber nicht den Namen des Wörterbuchs, so dass das gewünschte benannte Wörterbuch nicht aktualisiert wird. Anders ausgedrückt sieht es so aus, als würde ich eine Schleife durchlaufen, indem ich den Buchstaben S aus einer Liste verwende, aber dieser Buchstabe benennt auch ein Wörterbuch. Aber ich weiß nicht, wie man python die beiden verbindet.

Was brauche ich anstelle von eval() oder zusätzlich zu eval(), um mein Ziel zu erreichen?

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  

Vielleicht eine Auflistung der Ausgabe wird das Problem zeigen. Beachten Sie in der folgenden Beispielausgabe, dass die ersten 5 Karten Spaten sind und die nächsten 2 Karten Herzen, das K und Q der Herzen, um genau zu sein. Aber das Pikwörterbuch wird geändert, nicht das Herzwörterbuch. Diese fehlende Änderung des Arrays, das aktualisiert wird, wird für immer fortgesetzt.

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

Ich bin mir nicht sicher, ob es die Ursache für das Problem ist , aber 'S = H = D = C = {}' macht fast sicher nicht, was Sie wollen. Alle diese Namen verweisen auf dasselbe Wörterbuch. Ich nehme an, dass Sie wollen, dass sie beide separate Wörterbücher sind. – Blckknght

+0

Das ist genau das Problem. – zerowords

Antwort

1

Ihr Code Kuriosität wird hauptsächlich verursacht durch die Tatsache, dass alle Anzug Wörterbücher (S, H, D und C) das gleiche Wörterbuch verweisen. Sie müssen sie separat initialisieren, wenn sie auf eine andere Referenz verweisen sollen (z. B. S, H, D, C = {}, {}, {}, {}).

Das gesagt, eval ist (fast) nie eine Lösung. In Ihrem Fall würde ich so etwas wie:

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 

aber sagen, dass ich glaube, du bist zu verkomplizieren Ihrem Fall ...

+0

Sie brauchen _suits.keys() _ nicht unter _zip_ - nur _suite_ tut es. Die meisten iterierbaren Modifikatoren - z. B. _sorted_, _list_, _set_, usw. - handhaben Wörterbuchschlüssel unter der Haube. In Python 2. * _keys() _ erzeugt Zwischenliste; in Python 3. * es ist nur redundanter Code. – volcano

+0

Wahr, dass. Ich habe die Redundanz entfernt. – zwer

+0

Ja. Ich brauchte eine Weile, um zu sehen, dass du das 'eval()' ersetzt hast, was wünschenswert ist. Meinst du, dass noch eine andere Alternative das mehr vereinfachen würde? Zum Beispiel überlege ich, SHD & C als Range (13) zu definieren, (lists, not dicts) und suitDict [card] zu verwenden, was ein ganzzahliger Index in die Suit-Listen in meinem 'eval()' Prozess ist. Wenn ich das tue, denke ich * muss ich zu meinem ursprünglichen 'eval()' Prozess zurückkehren, aber das funktioniert, um SHD & C zu Listen zu machen, was mir irgendwie gefällt. Bemerkungen? – zerowords

Verwandte Themen