2016-10-27 5 views
0

リスト内のすべてのタプルにインデックスを追加する(新しいリストを作成することによって)?私が試したことの例を挙げます。私は操作をより速くしたいと思いますし、何か提案がありがたいです。インデックスを効率的に追加する

のは、私が

L = [(1463270, 0.681), (1432058, 0.678), (537044, 0.677), (252225, 0.677), (1222737, 0.676)] 

を有するある種の繰り返しで午前と仮定しましょうここでLは、5つのタプルが含まれていますが、私は実際には数百つのリスト内のタプルの何千もので働いています。

は私が最終スコアを計算する際にインデックスを必要とする

L = [(1463270, 0.681, 1), (1432058, 0.678, 2), (537044, 0.677, 3), (252225, 0.677, 4), (1222737, 0.676, 5)] 

になっL内のすべてのタプルにインデックスを追加すると、私はこの試みた:

iL = [] 
for i in range(1,top+1): ## top = 5 in my example 
    iL.append(L[i-1] + (i,)) 

をしかし、私は実際に使用しないようにしたいですこのようなループは、top = 500,000で、300万回の反復を持ちます。おそらくマップを使用して私の質問を解決する方法はありますか?

答えて

4

list comprehensionは、appendを使用するよりも確かに速いです。 enumerateは、リスト内のものにインデックスを追加するための良い方法です。あなたはそれがあなたの所望の出力を得るためにあなたを与えるものを並べ替える必要があります:

>>> L = [(1463270, 0.681), (1432058, 0.678), (537044, 0.677), 
... (252225, 0.677), (1222737, 0.676)] 
>>> L 
[(1463270, 0.681), 
(1432058, 0.678), 
(537044, 0.677), 
(252225, 0.677), 
(1222737, 0.676)] 

>>> [(x,y,i + 1) for i,(x,y) in enumerate(L)] 
[(1463270, 0.681, 1), 
(1432058, 0.678, 2), 
(537044, 0.677, 3), 
(252225, 0.677, 4), 
(1222737, 0.676, 5)] 

また、考慮してください。あなたはインデックスで、この新しいリストを格納する必要がありますか?数十万のタプルのメモリを割り当てるだけで時間がかかることがあります。あなたがこの新しいリストを1つだけ使用しているのであれば、遅く評価され、メモリを割り当てる必要がないgenerator expressionを使うと考えるかもしれません。

+1

'enumerate'の第2引数として始点を指定することができます。列挙する'((x、y、i)i、(x、y) ')'。 – chepner

+0

@chepner Nice!それ以前に見たことはありませんでした:) – wildwilhelm

+0

ありがとう。私のコードをもっと効率的にする方法があるかどうか教えてください。 idの範囲内(212864,2138098): L_src = ...一部の関数呼び出し L_trg = ...一部の関数呼び出し iL_src = [(x、y、i + 1)for i、(x、y) (x、y、i)は、列挙する(L_trg)内のi、(x、y、i) (λ1:l [0] Tsuki

関連する問題