2016-07-13 1 views
-1

私はタプルを持っています、(2,5,8)と言いましょう。Pythonのリストタスク

a = (2,5,8) 

タプルの各要素は、さまざまな値をとることができます。たとえば、最初の位置は0から4、2番目の位置は0から6、3番目の位置は0から10までです。私がしたいのは、固定位置2と3を保持し、最初の位置(2,5,8)のない要素です。次に、位置2と3について同じ操作を繰り返し、リスト出力に追加します。これは効率的に行うことができる方法上の任意のアドバイスをいただければ幸いです

[ (0,5,8), (1,5,8), (3,5,8), (4,5,8), 
(2,1,8), (2,2,8), (2,3,8), (2,4,8), (2,6,8), .. ] 

私の所望の出力のようなものです!

ありがとうございます!


編集:このタプルは、システムの状態を表します。私はタプルを入力として受け取り、システムが遷移可能なすべての可能な状態のリストを出力する関数を書き留めたいと思います。トリッキーな部分は、私が上で説明したトランジションのダイナミクスです。

+3

あなたの動機と可能性のある値の範囲は何ですか?あなたの例を解決するのは簡単ではないかもしれませんが(ループの最大20回の反復)、実際に20,000のように必要ならば解決策はひどいでしょう。 –

+1

それは配列ではない、それはタプル –

+0

私は自分の質問を編集しました。ありがとうございました – morfara

答えて

1

効率的にはどういう意味ですか?処理能力という意味であれば、3つのループを使用して、必要なものをリストに追加する必要があります。

result = [] 
for i in range(5): 
    result.append((i, 5, 8)) 
for i in range(7): 
    result.append((2, i, 8)) 
for i in range(9): 
    result.append((2, 5, i)) 

それとものpython3またはpython2のそれ以降のバージョンを使用している場合:

result = [(i, 5, 8) for i in range(5)] + [(2, i, 8) for i in range(7)] + [(2, 5, i) for i in range(9)] 

ので、最後に、あなたはあなたのリストにある5 + 8 + 9 = 22のアイテムが必要であることを念頭に置いて、それを保管してくださいループの単純な計算よりも効率的なものを書くことはできません。

編集:より一般的な解決のために:

base = (2, 5, 8) 
bounds = ((0, 4), (0, 7), (0, 9)) 
result = [] 
for i in range(len(base)): 
    result.extend((base[:i] + (j,) + base[i+1:] for j in range(bounds[i][0], bounds[i][1]+1))) 
+0

(2,5,8)は単なる例でした。一般的には任意の値を取ることができるので、私はより一般的な解決策を探しています。 – morfara

+0

ああ、申し訳ありません、私の答えを編集しました。 – Ariestinak

0

@Ariestinakは良い解決策を与えたものの、ここにあなたが使用できる一般的な機能である:

def getCombinations(a, b, c): 
    result = [(i, b, c) for i in range(5)] + \ 
      [(a, i, c) for i in range(7)] + \ 
      [(a, b, i) for i in range(9)] 
    return result 

そして、それを使用するためには、すべてのあなた、あなたがしなければならないのは:

a = (2,5,8) 
getCombinations(*a) 
+0

タプルの3つ以上の要素のためにそれを一般化する方法はありますか?私が考えていたのは次のようなものです: 'タプルの要素ごとに: 残りの要素を固定してください 可能なアクションを作成する' – morfara