2016-12-10 21 views
0
import random 

class player(): 
    def __init__(self, deck): 
     self.deck = deck 
     self.hand = [] 
     self.results = [] 

    def draw(self,draws): 
     for counter in range(0, draws, 1): 
      card = random.randrange(0, len(self.deck), 1) 
      self.hand.append(self.deck[card]) 
      del self.deck[card] 

    def return_hand(self): 
     for returncounter in range(0, len(self.hand), 1): 
      self.deck.append(self.hand[returncounter]) 
     for returncounter in range(0, len(self.hand), 1): 
      del self.hand[0] 

    def simple_function(self): 
     for counter in range(0, 3, 1): 
      print("Loop", counter) 
      self.draw(3) 
      print("Hand", simple_cards.hand) 
      self.results.extend(self.hand) 
      print("Results before return", simple_cards.results) 
      self.return_hand() 
      print("Results after return", simple_cards.results) 
      print("") 

simple_cards = player(["A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3"]) 

simple_cards.simple_function() 
print("Results after function", simple_cards.results) 

アン例Pythonのネストされたリストの作成

Loop 0 
Hand ['B3', 'B2', 'C3'] 
Results before return ['B3', 'B2', 'C3'] 
Results after return ['B3', 'B2', 'C3'] 

Loop 1 
Hand ['C2', 'B3', 'A1'] 
Results before return ['B3', 'B2', 'C3', 'C2', 'B3', 'A1'] 
Results after return ['B3', 'B2', 'C3', 'C2', 'B3', 'A1'] 

Loop 2 
Hand ['C2', 'B2', 'C1'] 
Results before return ['B3', 'B2', 'C3', 'C2', 'B3', 'A1', 'C2', 'B2', 'C1'] 
Results after return ['B3', 'B2', 'C3', 'C2', 'B3', 'A1', 'C2', 'B2', 'C1'] 

Results after function ['B3', 'B2', 'C3', 'C2', 'B3', 'A1', 'C2', 'B2', 'C1'] 

はどのように作るのですかだろう、このコードに起因するような結果3ネストされたリスト[[ 'B3'、 'B2'、 'C​​3']、 [C2、B3、A1]、[C2、B2、C1]]

ここで理解していないかなり基本的なことがあるように感じる質問は確かにすでに答えられていますが、私は自分自身を検索することによってそれを見つけるために質問をよりよくフレームする方法を知らない。

Iは追記(self.hand)をしようとした([self.hand])を延ばすが、両方は、それらが、任意の助けを

Loop 0 
Hand ['B3', 'A2', 'B2'] 
Results before return [['B3', 'A2', 'B2']] 
Results after return [[]] 

Loop 1 
Hand ['B2', 'B3', 'C3'] 
Results before return [['B2', 'B3', 'C3'], ['B2', 'B3', 'C3']] 
Results after return [[], []] 

Loop 2 
Hand ['C2', 'B3', 'A2'] 
Results before return [['C2', 'B3', 'A2'], ['C2', 'B3', 'A2'], ['C2', 'B3', 'A2']] 
Results after return [[], [], []] 

Results after function [[], [], []] 

おかげの出力例で得られた解決以上の問題を作成しました。

答えて

1

あなたはresultshandコピーを追加するためにappendを使用することができます。 handを追加するだけで問題になるのは、後でdelで修正することです。これは、例のように印刷結果に反映されます。

あなたはself.results.append(self.hand[:])self.results.extend(self.hand)を変更する場合は、出力を以下の取得:

Loop 0 
Hand ['A1', 'C2', 'B3'] 
Results before return [['A1', 'C2', 'B3']] 
Results after return [['A1', 'C2', 'B3']] 

Loop 1 
Hand ['B1', 'B3', 'A1'] 
Results before return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1']] 
Results after return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1']] 

Loop 2 
Hand ['C2', 'B1', 'C1'] 
Results before return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1'], ['C2', 'B1', 'C1']] 
Results after return [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1'], ['C2', 'B1', 'C1']] 

Results after function [['A1', 'C2', 'B3'], ['B1', 'B3', 'A1'], ['C2', 'B1', 'C1']] 
+0

感謝。 Pythonのドキュメント/チュートリアルの特定の部分はありますか?これは、私が別の変数を指し示すときに、まったく新しい値を作成するときに明確にするのに役立ちますか? 私は試行錯誤を通して学ぶと思います。なぜなら、私はPythonのドキュメントで使われている用語を部分的にしか理解していないので、それを読んでも分かりにくいものにならないからです。 – Diofsi

+0

@Diofsi [glossary](https://docs.python.org/3/glossary.html)で、ドキュメントで使用されているさまざまな用語を確認できます。 [データモデル](https://docs.python.org/3/reference/datamodel。html)をPythonリファレンスから参照してください。要するに、オブジェクトを変更するかどうかを調べるメソッドを呼び出すときには、ドキュメントをいつでも参照することができます。 – niemmi

1

ます。また、それは今あるもののように、あなたのコードを維持し、結果だけを分割することができます。

例えば、私はあなたの出力であることを前提としています。ためには、そう

[['B3', 'B2', 'C3'], ['C2', 'B3', 'A1'], ['C2', 'B2', 'C1']] 

expected_output = [output[i:i+3] for i in range(0, len(output), 3)] 
print(expected_output) 

が出力:

output = ['B3', 'B2', 'C3', 'C2', 'B3', 'A1', 'C2', 'B2', 'C1'] 

だから、あなたはこのような何かを行うことができますコードを編集するには、1行を編集するだけです:

から

self.results.extend(self.hand)だからあなたsimple_function()は次のようになります。編集後の

def simple_function(self): 
     for counter in range(0, 3, 1): 
      print("Loop", counter) 
      self.draw(3) 
      print("Hand", simple_cards.hand) 
      # The edited line 
      self.results.extend(self.hand[i:i+3] for i in range(0, len(self.hand), 3)) 
      print("Results before return", simple_cards.results) 
      self.return_hand() 
      print("Results after return", simple_cards.results) 
      print("") 

出力:私は:)を探していたソリューションの正確一種のthats

Loop 0 
Hand ['B1', 'C1', 'C3'] 
Results before return [['B1', 'C1', 'C3']] 
Results after return [['B1', 'C1', 'C3']] 

Loop 1 
Hand ['C1', 'C3', 'A3'] 
Results before return [['B1', 'C1', 'C3'], ['C1', 'C3', 'A3']] 
Results after return [['B1', 'C1', 'C3'], ['C1', 'C3', 'A3']] 

Loop 2 
Hand ['C2', 'A3', 'B3'] 
Results before return [['B1', 'C1', 'C3'], ['C1', 'C3', 'A3'], ['C2', 'A3', 'B3']] 
Results after return [['B1', 'C1', 'C3'], ['C1', 'C3', 'A3'], ['C2', 'A3', 'B3']] 

Results after function [['B1', 'C1', 'C3'], ['C1', 'C3', 'A3'], ['C2', 'A3', 'B3']] 
+1

ありがとう:)コード自体はニーミスの例よりも複雑ですが、結果をより複雑にスライスすることができます。これは、self.hand全体を必要としない場合に便利です。 – Diofsi

+0

はい、好きな手順でリストを分割できます。ですから、範囲[0、len(出力)、ステップ)]のiの[output [i:i + step]]とこの行の平均:範囲からの出力からのスライスのリストを返します私は0と出力の長さの間の範囲内のすべてのステップを実行しますが、ステップがあります。たとえば 'for k in range(0,7,3)'の場合、kは0,3,6になります。 –

+0

また、異なる方法で質問に回答できることを確認してください。簡単に理解できる方法を選択することができます。 –

関連する問題