我有一个数字列表,比如说
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])
等等。
答案 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]
不像其他一些解决方案那样优雅。还是应该提到这一点。