2016-05-28 8 views
4

私がやろうとしているpythonで、次のリストのリストと整数与えられた私はすべて持っている別のリストを取得する必要がありPythonはそれぞれi番目のサブリストの要素に値をマップ

input = [[1, 2, 3, 4], [1, 2, 3, 4], [5, 6, 7, 8]] 
i = 1 

I i番目のリストの要素のため1S、そうでなければ0

output = [0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0] 

私はこのコード

output = [] 
for sublist in range(0, len(input)): 
    for item in range(0, len(input[sublist])): 
     output.append(1 if sublist == i else 0) 

を書いて、それは明らかに動作しますが、BUは、私はPythonの初心者ですから、これを行うためのより良い "pythonic"方法があると思います。

私はmapを使用しても問題ないと思っていましたが、リストのインデックスを取得できません。

答えて

4

現在の要素のインデックスを取得するための余分な変数を作成することは、まったく不愉快です。通常の代替方法はenumerate組み込み関数の使用です。

列挙型オブジェクトを返します。シーケンスは、シーケンス、イテレータ、 または反復をサポートする他のオブジェクトでなければなりません。 のnext()メソッドは、enumerate()によって返されるイテレータは、 のカウント(startからデフォルトは0まで)と、 から取得された値を含むタプルを返します。

あなたは簡潔な1つのライナーのために内部の二重ループでリストの内包表記を使用することがあります。

input_seq = [[1, 2, 3, 4], [1, 2, 3, 4], [5, 6, 7, 8]] 
i = 1 
o = [1 if idx == i else 0 for idx, l in enumerate(input_seq) for _ in l] 

このケースでは、我々はドンので、代わりに、

o = [int(idx == i) for idx, l in enumerate(input_seq) for _ in l] 

アンダースコア」はちょうど使い捨ての名前です入力サブリストに格納されている実際の値を注意してください。

3

はここ1 - ライナーだが、それは本当に明白ではありません。

output = [int(j == i) for j, sublist in enumerate(input) for _ in sublist] 

ややより明白:次に

output = [] 
for j, sublist in enumerate(input): 
    output.extend([int(i == j)] * len(sublist)) 

"0または1?"サブリストごとに1回だけ計算されます。これは、効率的な場合とそうでない場合があります。

+0

他の1つとしても優れた回答です。私はポイントを分割することができたらいいと思う。両方に+1。 – Dean

関連する問題