12

reducePythonの便利な関数をご存知でしょう。たとえば、次のようにリストを合計するために使用できます (組み込みのsumがないふりをします)。

reduce(lambda x,y: x+y, [1,2,3,4], 0)

(((0+1)+2)+3)+4 = 10 を返します。

中間合計のリストが必要な場合はどうすればよいでしょうか。この場合、[1,3,6,10].

ここに醜い解決策があります。もっとpythonicなものはありますか?

def reducelist(f, l, x): 
  out = [x]
  prev = x
  for i in l:
    prev = f(prev, i)
    out.append(prev)
  return out
4

3 に答える 3

16

あなたが十分に最近なら、私のお気に入り:

Python 3.2.1 (default, Jul 12 2011, 22:22:01) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import itertools
>>> itertools.accumulate([1,2,3,4])
<itertools.accumulate object at 0x1006baad0>
>>> list(itertools.accumulate([1,2,3,4]))
[1, 3, 6, 10]

蓄積は関数の引数も受け入れます[さらに最近では-- 3.3]:

>>> list(itertools.accumulate([1,2,3,4], lambda x,y: x+y))
[1, 3, 6, 10]
>>> list(itertools.accumulate([1,2,3,4], lambda x,y: x+y+1))
[1, 4, 8, 13]
于 2012-09-02T06:06:12.623 に答える
9

ソリューションをジェネレーターにすると、ソリューションが短くなり、関数型プログラミング スタイルによりよく従います。x にもデフォルト値 0 を追加します。

def reducelist(f, lst, x=0): 
  prev = x
  for i in lst: 
    prev = f(prev, i)
    yield prev

それは間違いなくよりpythonicです。

于 2012-09-02T06:14:35.500 に答える