对列表中的每两个元素执行操作

6 投票
5 回答
615 浏览
提问于 2025-04-16 02:24

我有一串数字,比如说:

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)]

撰写回答