のような整数のタプルがあり、隣接する要素を乗算し(1, 2, 3, 4, 5)
てタプルを生成したいと考えています。(1*2, 2*3, 3*4, 4*5)
ワンライナーでこれを行うことは可能ですか?
質問する
2397 次
5 に答える
10
短くて甘い。zip
最短の入力がある限り実行されることに注意してください。
print tuple(x*y for x,y in zip(t,t[1:]))
于 2013-02-17T01:13:14.887 に答える
6
>>> t = (1, 2, 3, 4, 5)
>>> print tuple(t[i]*t[i+1] for i in range(len(t)-1))
(2, 6, 12, 20)
ただし、最もpythonicなソリューションではありません。
于 2013-02-17T01:04:52.650 に答える
3
tu = (1, 2, 3, 4, 5)
it = iter(tu).next
it()
print tuple(a*it() for a in tu)
さまざまなコードの時間を測定しました:
from random import choice
from time import clock
from itertools import izip
tu = tuple(choice(range(0,87)) for i in xrange(2000))
A,B,C,D = [],[],[],[]
for n in xrange(50):
rentime = 100
te = clock()
for ren in xrange(rentime): # indexing
tuple(tu[x]*tu[x+1] for x in range(len(tu)-1))
A.append(clock()-te)
te = clock()
for ren in xrange(rentime): # zip
tuple(x*y for x,y in zip(tu,tu[1:]))
B.append(clock()-te)
te = clock()
for ren in xrange(rentime): #i ter
it = iter(tu).next
it()
tuple(a*it() for a in tu)
C.append(clock()-te)
te = clock()
for ren in xrange(rentime): # izip
tuple(x*y for x,y in izip(tu,tu[1:]))
D.append(clock()-te)
print 'indexing ',min(A)
print 'zip ',min(B)
print 'iter ',min(C)
print 'izip ',min(D)
結果
indexing 0.135054036197
zip 0.134594201218
iter 0.100380634969
izip 0.0923947037962
izip は zip よりも優れている: - 31 %
私の解決策はそれほど悪くはありません (ちなみに、私はそうは思いませんでした): zip に対して相対的に -25%、チャンピオン izip よりも 10% 長い時間
インデックス作成が zip より速くないことに驚いています: nneonneo は正しく、zip は受け入れられます
于 2013-02-17T01:23:24.203 に答える
3
t がタプルの場合:
>>> tuple(t[x]*t[x+1] for x in range(len(t)-1))
(2, 6, 12, 20)
そして素敵な地図を使った別の解決策:
>>> tuple(map(lambda x,y:x*y, t[1:], t[:-1]))
(2, 6, 12, 20)
編集:スライスの余分なメモリ消費が心配な場合は、タプルを反復処理する itertools の islice を使用できます(thx @eyquem):
>>> tuple(map(lambda x,y:x*y, islice(t, 1, None), islice(t, 0, len(t)-1)))
(2, 6, 12, 20)
于 2013-02-17T01:06:59.517 に答える
2
のレシピがitertools
好きです :
from itertools import izip, tee
def pairwise(iterable):
xs, ys = tee(iterable)
next(ys)
return izip(xs, ys)
print [a * b for a, b in pairwise(range(10))]
結果:
[0, 2, 6, 12, 20, 30, 42, 56, 72]
于 2013-02-17T01:19:17.757 に答える