私は を使用itertools
しますが、それが複雑だと思う場合 (コメントで示唆したように)、おそらく:
def twobytwo(t):
it = iter(t)
for x in it:
yield x, next(it)
d = dict(twobytwo(t))
または同等に、再び itertools に戻ります。
def twobytwo(t):
a, b = itertools.tee(iter(t))
next(b)
return itertools.izip(a, b)
d = dict(twobytwo(t))
または、インラインであることを主張する場合は、季節に適した「トリック・オア・トリート」ムードで:
d = dict((x, next(it)) for it in (iter(t),) for x in it)
私はこれをトリックだと考えていますが、一部の人はそれをご馳走だと思うかもしれません. IOW、私はこの種のことを怖いと思いますが、どうやらアメリカではこの時期に物事が起こるはずです;-)。
基本的に、問題は「リストを一度に 2 項目ずつ移動するにはどうすればよいか」にdict
要約されます。ここで示しているすべてのソリューションでは、余分なスペースのみが確保されます (もちろん、入力リストと出力辞書に必要なO(1)
スペースを超えて)。O(N)
ドキュメントで提案されているアプローチ(誰もがそのページ、 itertool レシピに精通している必要があります) は、pairwise
そのページの関数であり、基本的にここで提案した 2 番目のものです。すべての site-packages ディレクトリには、これらのレシピを含むファイルが含まれている必要があると思いますiterutils.py
(そのようなファイルがまだ python の stdlib に含まれていないのは残念です!-)。