1. ホーム
  2. パイソン

[解決済み】Python 3でfilter, map, reduceを使うには?

2022-05-10 07:09:42

質問

filter , map そして reduce はPython 2で完全に動作します。以下はその例です。

>>> 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.0での新機能 . 2.xから3.xに移行する際には、多くの変更がなされたため、これをよく読む必要があります。

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

リストではなくビューとイテレータ

いくつかのよく知られたAPIはもはやリストを返しません。

  • [...]
  • map() そして filter() はイテレータを返します。もし本当にリストが必要なら、手っ取り早いのは例えば list(map(...)) しかし、より良い解決策はリスト内包を使うか(特に元のコードがラムダを使っている場合)、リストを全く必要としないようにコードを書き直すことです。特に厄介なのは map() 関数の副作用のために呼び出されるものです。正しい変換は、通常の for ループを使用することです (リストを作成するのは無駄なだけなので)。
  • [...]

組み込み

  • [...]
  • 削除された reduce() . 使用方法 functools.reduce() を使用します。しかし、99% の場合、明示的な for ループの方が可読性が高いです。
  • [...]