3

我有一个整数元组,(1, 2, 3, 4, 5)我想(1*2, 2*3, 3*4, 4*5)通过将相邻元素相乘来产生元组。可以用单线做到这一点吗?

4

5 回答 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

如果 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 回答
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 %

我的解决方案还不错(顺便说一句,我不这么认为):-25% 相对于 zip,比冠军 izip 多 10% 的时间

我很惊讶索引并不比 zip 快:nneonneo 是正确的, zip 是可以接受的

于 2013-02-17T01:23:24.203 回答
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 回答