对列表中的每两个元素执行操作
我有一串数字,比如说:
data = [45,34,33,20,16,13,12,3]
我想计算每两个数字之间的差,比如对于上面的数据,我想计算 45-34、33-20、16-13 和 12-3,这在 Python 中怎么做呢?
另外,更一般来说,我应该如何对这些元素每两个一组地应用一个函数呢?也就是说,我想调用 myfunc(data[0],data[1]),myfunc(data[2],data[3])
这样的方式来处理这个列表。
5 个回答
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
我通常会使用列表理解和切片,但这些解决方案有时候可能更容易理解。
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)]
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)]