2017-02-15 4 views
0

以下の処理は変数dealListを解析して4つの辞書SHDとCを設定することを目的としています。問題は、スーツがどこにあるeval(suit)のコードの最後から二番目の行にあると思いますかループスルー。このコードのevalの代替手段がありますか

すべてのスーツSHD、およびCは空の辞書として初期化されますが、最終的にはスーツの各カードに1つの辞書項目が13個含まれています。

私は、eval(suit)が実行されるたびに辞書を検索して辞書を検索しますが、辞書の名前は保持しないので、目的の名前付き辞書は更新されないと考えられます。別の言い方をすれば、リストから取ったSという文字を使ってループを繰り返しているように見えますが、その文字も辞書の名前です。しかし、私はPythonに2つが関連付けられている方法を知らない。

私の目標を達成するために、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枚はスペードであり、次の2枚はハート、すなわちハートの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

あなたのコード風変わりは、主にすべてのあなたのスーツの辞書(SHDC)は同じ辞書を参照していることに起因します。別の参照(たとえば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

あなたは_zip_の下で_suits.keys()_を必要としません - ただ_suite_が行います。 _sorted_、_list_、_set_などのほとんどの繰り返し可能な修飾子は、フードの下にある辞書キーを処理します。 Python 2. * _keys()_は中間リストを生成します。 Python 3で*冗長なコードです。 – volcano

+0

それは本当です。私は冗長性を取り除いた。 – zwer

+0

はい。あなたが 'eval()'を置き換えたのを見るのにはしばらく時間がかかりました。これは望ましいことです。他の選択肢でさえこれをもっと単純化することを意味しますか?例えば、私はSHD&Cのスーツを範囲(13)、(リストではなく、辞書ではない)として定義し、私の 'eval()'プロセスでスーツリストの整数インデックスであるsuitDict [card]を使うことを考えています。もし私がそうするなら、元の 'eval()'プロセスに戻す必要があると思うが、それはSHD&Cをリストにするために働く。コメント? – zerowords

関連する問題