Comment detail

隣り合う二項の差 (Nested Flatten)
mapを使った。
1
2
3
4
def diff(xs):
    return map(lambda (x,y):y-x, zip(xs[:-1], xs[1:]))

print diff([3, 1, 4, 1, 5, 9, 2, 6, 5])

言語をPythonに変更しておきました。

ついでなので少しつっこむと、この方法は2回のスライシングで2回コピーを行うのでxsが長いときには非効率ですね。

Pythonのzipは一番短いものにあわせるて長いものを切り捨てるのでzip(xs, xs[1:])で問題ないです。それでも1回コピーが起きるわけですが。

#2396 oceanさんの方法はコピーが起きません。下のコードはそれをさらにジェネレータにしたバージョンです。

1
2
3
def diff(xs):
	for i in range(1, len(xs)):
		yield xs[i] - xs[i - 1]

スライスもそうだけど zip も非効率といえば非効率ですね。 というわけで itertools & generator expression で。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
from itertools import izip, islice

def tail(xs):
    return islice(xs, 1, len(xs))

def diff(xs):
    """
    >>> diff([3, 1, 4, 1, 5, 9, 2, 6, 5])
    [-2, 3, -3, 4, 4, -7, 4, -1]
    """
    return (x - y for x, y in izip(tail(xs), xs))

Index

Feed

Other

Link

Pathtraq

loading...