Python 3 で filter、map、reduce を使用する方法 質問する

Python 3 で filter、map、reduce を使用する方法 質問する

これは私がPython 2 で、、およびを操作するのfiltermap慣れている方法です:reduce

>>> def f(x):
        return x % 2 != 0 and x % 3 != 0
>>> filter(f, range(2, 25))
[5, 7, 11, 13, 17, 19, 23]

>>> def cube(x):
        return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

>>> def add(x,y):
        return x+y
>>> reduce(add, range(1, 11))
55

ただし、これらはすべて Python 3 では機能しないようです。

>>> filter(f, range(2, 25))
<filter object at 0x0000000002C14908>

>>> map(cube, range(1, 11))
<map object at 0x0000000002C82B70>

>>> reduce(add, range(1, 11))
Traceback (most recent call last):
  File "<pyshell#8>", line 1, in <module>
    reduce(add, range(1, 11))
NameError: name 'reduce' is not defined

なぜ結果が異なるのでしょうか? Python 3 コードを Python 2 コードと同じように動作させるにはどうすればよいですか?


参照:Reduce() の問題は何でしょうか?変更をreduce組み込みのままにするのではなく、標準ライブラリ モジュールに組み込むという具体的な動機。

見るPython 3.x で map() を使ってリストを返すについてのより具体的な回答については、 をご覧くださいmap

ベストアンサー1

変更内容については、Python 3.0 の新機能多くの変更が加えられているため、2.x から 3.x に移行するときは、これをよく読んでください。

ここでの回答全体はドキュメントからの引用です。

リストの代わりにビューとイテレータを使用する

いくつかのよく知られた API はリストを返さなくなりました:

  • [...]
  • map()そしてfilter()反復子を返します。リストが本当に必要な場合は、たとえば という簡単な修正方法が考えられますlist(map(...))が、多くの場合、リストの内包表記を使用するか (特に元のコードがラムダを使用している場合)、リストがまったく必要ないようにコードを書き直す方がよいでしょう。map()関数の副作用については特に注意が必要です。正しい変換は通常のforループを使用することです (リストを作成するのは無駄なだけなので)。
  • [...]

ビルトイン

  • [...]
  • 削除されましたreduce()。使用functools.reduce()本当に必要な場合はそうします。ただし、99 パーセントの場合、明示的なforループの方が読みやすくなります。
  • [...]

おすすめ記事