2012-04-04 8 views
0

可能性の重複を項目を引く:
pairwise traversal of a list or tuple効率的にその兄弟からリストに

私はこのリストを持っている:[(0, 'set'), (1, 'of'), (4, 'coloured'),(5, 'eels')]

私は効率的にアイテム+ 1を反復して達成したいと思います[0] - 項目[0]

1 - 0、4 - 1,5 - 4

私は現在持っている:

search_list = [(0, 'set'), (1, 'of'), (4, 'coloured')] 
[search_list[i+1][0]-search_list[i][0] for i in range(0,len(search_list)-1)] 

をしかし、私のコードは、私が希望ほど効率的ではありません。地図とラムダが結果を達成できるか?

私は効率的であることについてはよく分からない私は、モジュールをインポートしないようしたいと思います(しかし、当然のことながら、ラムダとマップがこれを達成することができないだろう場合)

+2

より良い解決策をお聞かせしました。あなたはNumPy(具体的には 'numpy.diff()')を使わないと、あなたが持っているものよりも格段に優れたものは見つかりません。 –

+0

Svenの言及がここでもうまくいくはずであるという質問の答えが答えただけで、タプルの要素にもアクセスする必要があります。 –

+0

通常、lambaのマップはリスト内包よりも遅いです。また、Python 2を使用している場合は、 'range'ではなく 'xrange'を使用してください。リストの代わりにジェネレータが作成されます。 – jamylak

答えて

0

:人気によって

>>> search_list = [(0, 'set'), (1, 'of'), (4, 'coloured'),(5, 'eels')] 
>>> [y[0]-x[0] for x,y in zip(search_list,search_list[1:])] 
[1, 3, 1] 

itertoolsバージョンをお問い合わせ:

>>> from itertools import izip, islice 
>>> search_list = [(0, 'set'), (1, 'of'), (4, 'coloured'),(5, 'eels')] 
>>> [y[0]-x[0] for x,y in izip(search_list, islice(search_list, 1, None))] 
[1, 3, 1] 
+1

あなたは一度だけスライスする必要があります - 長いリストは 'zip'によって最後の項目が無視されます。ありがとう。 – agf

+0

ありがとう。 timeitの表示: 1000回実行時:0.00149552307798s 1000回実行時0.00224554247503s @agfコメントに基づいて回答を改善できますか? – rikAtee

+1

@rikAtee実際にはボトルネックですか?そうでない場合は、心配しないでください。 zip(search_list、search_list [1:])]のx、yの[y [0] -x [0]は余分なスライスよりもやや速く、メモリを少なくする必要はありません。メモリの使用が重要な場合は、あなたのバージョンを使うか、 'search_list [1:]'の代わりに 'zip'や' islice(1、len(search_list)) 'の代わりに' itertools' - 'izip'を使うことができます。 – agf

関連する問題