2016-12-21 9 views
0

私は多重配列を作成して何かを追加したいのですが、ユーザは追加したい配列を選択する必要があります。Python - 名前が文字列で与えられた配列に追加する

だから私は何を意味するかを明確にする:(ダウンコードは下に間違っているが、私は、私はそれを書くことができるのか分からない。)

x = [] 
y = [] 

def test(pName): 
    %s.append(1) %pName 

test(y) 

編集:

@Jim Fasarakis、ヒリアード

私はPyGameでプログラムしようとしています。 そのため私は使用したいすべての画像を初期化する必要があります。

拡張しないようにするには、任意の配列に簡単に追加できる関数を作成したかったので、新しい画像を作成するたびに新しい関数を作成する必要はありません。

私のコードは、このATMのように見えます。:

def loadImages(self,pName,pAnz,pScaleX,pScaleY): 
    for i in range(0,pAnz): 
     tux = pygame.transform.scale(pygame.image.load('./images/%s.png'),(pScaleX,pScaleY) % pName) 
     self.%s.append(tux) %pName 
    length_array = len(self.%s) %pName 
    return length_array 
+3

hmm、なぜ辞書を使用しないのですか? – danielfranca

+0

ピクチャやオブジェクトを保存する必要があるため、すべてを配列に保存することが重要です。 – freedome97

+0

@ freedome97あなたは配列に格納できる辞書にすべてを格納することができます;) –

答えて

1

あなたが望むすべてが異なる「名前空間」にあなたのオブジェクトを保存できるようにする場合は、辞書を使用することができます。グローバルまたはsimilars私見を使用するよりも理解し

lists = { 
    "x": [], 
    "y": [] 
} 

def test(pName): 
    lists[pName].append(1) 

test("y") 

クリーナーと容易になります。

+0

うまくいかないでしょう。 'y'はオブジェクトを参照する名前で、' y 'は1つの文字列を始めることを区別する必要があります。 – quapka

2

あなたは、globalsを使用する関数に変数名の文字列を渡すことができます。

def test(pName): 
    globals()[pName].append(1) 

test('y') 

この、もちろん、に依存していますグローバルスコープに存在する名前。

+0

'locals()'で十分でしょうか? –

+0

クラス内で使用すると、それも動作しますか?なぜならself.globals()はおそらくエラーを引き起こすからです。 – freedome97

+0

globals()はビルトインです。 globals()にはすべてのグローバルが含まれています –

2

配列を辞書に入れることができます。辞書内のキーでないはpNameがキー例外がスローされますようあなたは、ユーザーの入力をチェックしたいと思うでしょう

arrays = {} 
arrays['x'] = [] 
arrays['y'] = [] 

def test(pName): 
    arrays[pName].append(1) 

test('y') 

:配列の固定数があると仮定すると、コードは次のようになります。配列を動的にしたい場合は、次のようにすることができます:

arrays={} 
def test(pName): 
    if pName not in arrays.keys(): 
     arrays[pName]=[] 
    arrays[pName].append(1) 

test('y') 
+0

問題の内容を知っている場合は、try/exceptを使用しないでください。 'pNameが配列でない場合:... '次に、キーと値のペアを作成します。 'if'の外側に' 1'を追加します。はるかにクリーンです。 –

+0

@MatthiasBurgerこの例で 'try-except'ブロックがうまくいかない理由はわかりません。これは一般的に制御フローに使用され、この例ではユーザーが既存のキーを入力し、そうでない場合は通常の場合の例外とみなされます。また、すべての文字列を取得して「pName」と比較する必要がないため、通常の場合(例外的には遅くなりますが)でも高速になります。私はまた、 'try-except'は' if'と同じくらいきれいだったと言います。なぜなら、キーがあれば何をするべきかを示していたからです。 –

+0

@TedKleinBergman私は言ったことがない、試してみてください。おそらく例外が分かっているときにtry-exceptを使うのは悪い習慣です。開発者が例外タイプに入らずにポケモンのようなものを捕まえるようなケースもある(try/exceptは簡単だから)。多分私は 'イホ'か何かを書かなければならなかったかもしれませんし、もし/ elseがtry/exceptよりも優れていると思う人はおそらく30%です。 SOTAは、ifで処理できないケースでtry-catchを使用することです。 –

関連する問題