列表中连续元素之间的差异

gok*_*gok 29 python list

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

我有一个列表,我想找到连续元素之间的区别:

a = [0, 4, 10, 100]
find_diff(a)
>>> [4,6,90]
Run Code Online (Sandbox Code Playgroud)

你会如何编码find_diff()函数?我可以使用"for"迭代器对此进行编码,但我确信有一个非常简单的方法可以使用简单的单行程序.

mik*_*iku 46

你可以利用enumerate,zip列出理解:

>>> 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]
Run Code Online (Sandbox Code Playgroud)

在性能方面,似乎没有太多的变化:

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
Run Code Online (Sandbox Code Playgroud)


Ste*_*ski 16

使用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)
Run Code Online (Sandbox Code Playgroud)

像这样使用它:

>>> a = [0, 4, 10, 100]
>>> [y-x for x,y in pairwise(a)]
[4, 6, 90]
Run Code Online (Sandbox Code Playgroud)

  • @Matt Ball:许多迭代器可以被称为"不必要的",但一旦定义,它们对常见的习语很有用.当我们可以为像"pairwise"这样的想法指定一个有用的名称时,为什么要求读者解开两片的拉链.当我直接从文档中提取示例时,我认为我并不孤单. (13认同)

kin*_*all 6

[x - a[i-1] if i else None for i, x in enumerate(a)][1:]
Run Code Online (Sandbox Code Playgroud)