4

次のコード例を検討してください。mapこの例は、との間の機能の違いを強調するために示していますitertools.imap。私が本当にやりたいことは、リスト内包表記では実行できません。実際の問題では、リストを作成するのではなく、より大きなnumpy配列を小さな配列で埋めているからです。したがって、以下のコードへの対応として、次のことを提案しないでください。[f(x) for x in range(3)]

例:

g = []

def f(x):
    g.append(x)

私が得た結果mapと itertools.map:

map(f, range(3)) # Results in g = [0,1,2]

itertools.imap(f, range(3)) # Does not change g

関数gによって行われるように変更したい。ただし、 Python 3のように動作する (または動作する) と map聞いたことがあります。Python 2.7 を使用していますが、イテレータ バージョンのマップを使用する正しい方法を学びたいと考えています。と同じ結果を得るにはどうすればよいですか?mapitertools.imapitertools.imapmap

できます:

b = itertools.imap(f, range(3))
list(b) # This gives g = [0,1,2] if starting with an empty g.

これは正しい方法ですか、それともより良い方法はありますか?

前もって感謝します。

4

3 に答える 3

11

itertools関数はジェネレータを返します。それらは反復されたときにのみ動作します。したがって、実行して完了するまでitertools.imap(f, range(3))実際にlist何もしません。

http://docs.python.org/2/library/itertools.html#recipesによると、イテレータを使用する最も効率的な方法は、長さゼロの両端キューを使用することです。

collections.deque(itertools.imap(f, range(3)), maxlen=0)

ただし、副作用のために関数を呼び出す場合は、関数構文ではなく命令を使用する必要があります。

for i in range(3):
    f(i)
于 2012-12-14T22:08:37.160 に答える
2

map()間違って使用しています。これは、関数呼び出しの副作用には使用しないでください。反復可能オブジェクトを変換するために使用する必要があります。

を使用list(itertools.imap(f, range(3)))して目的の動作を取得できますが、通常のforループを使用するようにアプローチ全体を変更する必要があると思います。

for i in range(3):
    f(i)

これにより、f()呼び出しからの戻り値が使用されていないことが明確になります。

于 2012-12-14T22:11:55.917 に答える
1

違いはmap、Python2.xではPython3と同等であるというlist(map(...))ことです。それだけです。特別なことは何もありません...

于 2012-12-14T22:09:37.520 に答える