2011-12-31 36 views
0

2つの要素の位置を交換する方法はありますか?Pythonの2つの配列要素の交換位置

私はいくつかのコードを思いついたが、それは非常に醜いとパフォーマンスが少し悪いようになります。

chromo = [[1,2], [3,4], [5,6]] 

gene1Pos = random.randrange(0, len(chromo)-1, 1) 
gene2Pos = random.randrange(0, len(chromo)-1, 1) 
tmpGene1 = chromo[gene1Pos] 
tmpGene2 = chromo[gene2Pos] 
chromo[gene1Pos] = tmpGene2 
chromo[gene2Pos] = tmpGene1 

これは動作するはずですが、まあ、それは素晴らしいではありません。より良い方法は、random.shuffleのようなルーチンですが、すべてを混合するのではなく、n個の要素だけを混合することになります。あなたは何か考えていますか?

答えて

6

だからあなたはちょうどあなたがノー、ノー、ノー、右genXPos

+1

これが何をコンパイルし、なぜそれが最速であるのかについては、http://stackoverflow.com/questions/4554130/fastest-way-to-swap-elements-in-python-listを参照してください。 – dkamins

+0

ありがとうございます。これは少しきれいで、dkaminsが指摘しているように、より速くです。 – jbssm

1

スライス/スライスの割り当てで、Pythonの変数を交換するための通常のメカニズムを組み合わせてください。

>>> a = [1, 2, 3, 4, 5] 
>>> a[2:3], a[4:5] = a[4:5], a[2:3] 
>>> a 
[1, 2, 5, 4, 3] 
-1

あなたの行っていることに何も問題はありません。あなたは一時変数のいずれかを削除することによってそれを単純化することができます。 abを交換するために必要なのはこれです:

tmp = a 
a = b 
b = tmp 
+2

を持っていることを確認する必要があり

>>> chromo[gene1Pos], chromo[gene2Pos] = chromo[gene2Pos], chromo[gene1Pos] 

を試してみてください!これはあなたが考えているPythonではありません! Pythonでは、タプルのアンパックとタプルの代入により、 'a、b = b、a'と書くことができます。 – PaulMcG

+0

@PaulMcGuire合意。あなたの答え(私がアップしたもの)の再演(「a、b = b、aは最速です)」に対する私のコメントを参照してください。しかし、tempを介して交換することは、常にプログラマーのツールボックスに保存するための古典的なマイクロアルゴリズムになります。 – dkamins

関連する問題