列表中连续元素的差异

38 投票
3 回答
68812 浏览
提问于 2025-04-16 13:44

可能重复的问题:
Python - 列表元素之间的差异

我有一个列表,我想找出相邻元素之间的差值:

a = [0, 4, 10, 100]
find_diff(a)
>>> [4,6,90]

你会怎么写一个 find_diff() 函数呢?我可以用“for”循环来实现,但我相信有更简单的方法可以用一行代码做到这一点。

3 个回答

6

在编程中,有时候我们会遇到一些问题,比如代码运行不正常或者出现错误。这时候,我们可以去一些技术论坛,比如StackOverflow,去寻找解决方案或者向其他人请教。

在这些论坛上,很多人会分享他们的经验和解决方法。你可以看到其他人遇到的类似问题,以及他们是如何解决的。这不仅能帮助你解决自己的问题,还能让你学到更多的知识。

总之,技术论坛是一个很好的资源,特别是对于刚开始学习编程的人来说。通过阅读别人的问题和答案,你可以更快地掌握编程的技巧。

[x - a[i-1] if i else None for i, x in enumerate(a)][1:]
20

使用 itertools.pairwise(适用于Python 3.10及以上版本):

>>> from itertools import pairwise
>>> a = [0, 4, 10, 100]
>>> [y - x for x, y in pairwise(a)]
[4, 6, 90]

对于Python 3.9及更早的版本,你可以参考来自itertools文档的 pairwise的实现方法

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

你可以使用 enumeratezip列表推导式 来实现你的需求:

>>> a = [0, 4, 10, 100]

# basic enumerate without condition:
>>> [x - a[i - 1] for i, x in enumerate(a)][1:]
[4, 6, 90]

# enumerate with conditional inside the list comprehension:
>>> [x - a[i - 1] for i, x in enumerate(a) if i > 0]
[4, 6, 90]

# the zip version seems more concise and elegant:
>>> [t - s for s, t in zip(a, a[1:])]
[4, 6, 90]

从性能上看,似乎没有太大的差别:

In [5]: %timeit [x - a[i - 1] for i, x in enumerate(a)][1:]
1000000 loops, best of 3: 1.34 µs per loop

In [6]: %timeit [x - a[i - 1] for i, x in enumerate(a) if i > 0]
1000000 loops, best of 3: 1.11 µs per loop

In [7]: %timeit [t - s for s, t in zip(a, a[1:])]
1000000 loops, best of 3: 1.1 µs per loop

撰写回答