Python Language
減らす
サーチ…
構文
- reduce(関数、iterable [、initializer])
パラメーター
パラメータ | 詳細 |
---|---|
関数 | iterableを減らすために使用される関数(2つの引数を取る必要があります)。 ( 位置限定のみ ) |
繰り返し可能な | iterableは減少するだろう。 ( 位置限定のみ ) |
イニシャライザ | 減少の開始値。 ( オプション 、 位置指定のみ ) |
備考
reduce
は常に最も効率的な関数であるとは限りません。いくつかの型には、同等の関数またはメソッドがあります。
addable要素(文字列ではありません)を含むシーケンスの合計の
sum()
sum([1,2,3]) # = 6
文字列の連結のための
str.join
:''.join(['Hello', ',', ' World']) # = 'Hello, World'
next
一緒ジェネレータとする比較短絡変異体とすることができるreduce
。# First falsy item: next((i for i in [100, [], 20, 0] if not i)) # = []
概要
# No import needed
# No import required...
from functools import reduce # ... but it can be loaded from the functools module
from functools import reduce # mandatory
reduce
の次の要素に繰り返し関数を適用することによって、反復可能を低減iterable
これまでの累積結果。
def add(s1, s2):
return s1 + s2
asequence = [1, 2, 3]
reduce(add, asequence) # equivalent to: add(add(1,2),3)
# Out: 6
この例では、独自のadd
関数を定義しました。しかし、Pythonには、 operator
モジュールに標準で同等の関数が用意されています。
import operator
reduce(operator.add, asequence)
# Out: 6
reduce
は開始値を渡すこともできます:
reduce(add, asequence, 10)
# Out: 16
reduceを使う
def multiply(s1, s2):
print('{arg1} * {arg2} = {res}'.format(arg1=s1,
arg2=s2,
res=s1*s2))
return s1 * s2
asequence = [1, 2, 3]
initializer
が与えられると、関数はイニシャライザと最初のiterable要素に適用されます。
cumprod = reduce(multiply, asequence, 5)
# Out: 5 * 1 = 5
# 5 * 2 = 10
# 10 * 3 = 30
print(cumprod)
# Out: 30
なければinitializer
パラメータインクルードをreduce
最初の2つのリストの要素に関数を適用することによって、開始を:
cumprod = reduce(multiply, asequence)
# Out: 1 * 2 = 2
# 2 * 3 = 6
print(cumprod)
# Out: 6
累積製品
import operator
reduce(operator.mul, [10, 5, -3])
# Out: -150
任意/すべての非短絡バリアント
reduce
はiterable
が完全に反復される前にiterable
終了しないので、短絡しany()
またはall()
関数を作成するために使用できます。
import operator
# non short-circuit "all"
reduce(operator.and_, [False, True, True, True]) # = False
# non short-circuit "any"
reduce(operator.or_, [True, False, False, False]) # = True
シーケンスの最初の真理/偽の要素(または、もし存在しなければ最後の要素)
# First falsy element or last element if all are truthy:
reduce(lambda i, j: i and j, [100, [], 20, 10]) # = []
reduce(lambda i, j: i and j, [100, 50, 20, 10]) # = 10
# First truthy element or last element if all falsy:
reduce(lambda i, j: i or j, [100, [], 20, 0]) # = 100
reduce(lambda i, j: i or j, ['', {}, [], None]) # = None
lambda
関数を作成する代わりに、名前付き関数を作成することが一般的に推奨されています。
def do_or(i, j):
return i or j
def do_and(i, j):
return i and j
reduce(do_or, [100, [], 20, 0]) # = 100
reduce(do_and, [100, [], 20, 0]) # = []
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow