对列表中的2个和2个元素执行操作

时间:2010-08-06 09:00:23

标签: python

我有一个数字列表,比如说

data = [45,34,33,20,16,13,12,3]

我想计算2到2项之间的差异(即,对于上述数据 我想计算45-34,33-20,16-13和12-3,python的做法是什么?

另外,更一般地说,我应该如何将函数应用于这些元素中的2个和2个,也就是说,我想在列表上调用myfunc(data[0],data[1]),myfunc(data[2],data[3])等等。

5 个答案:

答案 0 :(得分:6)

尝试切片列表:

from itertools import izip
[myfunc(a, b) for a, b in izip(data[::2], data[1::2])]

或者您可以使用izip保证其使用其参数的顺序这一事实:

idata = iter(data)
[myfunc(a, b) for a, b in izip(idata, idata)]

答案 1 :(得分:2)

你可以创建自己的迭代器来迭代2:2的元素:

class myiter(object):
    def __iter__(self):
        return self
    def next(self):
        a = self.l.next()
        b = self.l.next()
        return (a, b)
    def __init__(self, l):
        self.l = iter(l)

迭代器一次返回两个元素的元组:

>>> for x, y in i(data):
...     print x, y
45 34
33 20
16 13
12 3

然后你可以用它来映射你的功能:

>>> [myfunc(x, y) for x, y in myiter(data)]

答案 2 :(得分:2)

def pairs(iterable):
    while iterable:
        yield next(iterable),next(iterable)

data = [45,34,33,20,16,13,12,3]
print "With pairs generator"
print ','.join(str(a-b) for a,b in pairs(iter(data)))

消耗版本(数据将从列表中删除,因此如果仍然需要请复制),“无需理解”。

print 'By simple list pop way'
data_c = data[:]
result=[]
while data_c: result.append(data_c.pop(0)-data_c.pop(0))
print result

我通常会使用列表推导和切片,但这些解决方案有时可能更容易理解。

答案 3 :(得分:1)

from itertools import tee,izip

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return izip(a, b)

for a,b in pairwise(data):
    print a-b

需要Python 2.6或更高版本。我从here获取pairwise()

答案 4 :(得分:1)

diffs = [data[i] - data[i+1] for i in range(0, len(data), 2)]

或一般情况

pairs = [(data[i], data[i+1]) for i in range(0, len(data), 2)]
results = [myfunc(*p) for p in pairs]

不像其他一些解决方案那样优雅。还是应该提到这一点。