【问题标题】:Difference between consecutive elements in list [duplicate]列表中连续元素之间的差异[重复]
【发布时间】:2011-03-15 15:46:16
【问题描述】:

可能重复:
Python - Differences between elements of a list

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

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

如何编写 find_diff() 函数?我可以使用“for”迭代器对此进行编码,但我确信有非常简单的方法可以使用简单的单行来完成。

【问题讨论】:

  • 嗯,我打算接受第一个答案,但我看到它现在被删除了。
  • 应该是这样,因为这个问题问的完全相同
  • 所以我应该删除这个问题吗?在询问之前我在搜索中找不到那个
  • 不要删除它。这将作为 dup 关闭,因此无法添加更多答案。一般来说,最好有多个指向单个规范问答的重复。由于一个问题的表述方式不止一种,因此有多个(措辞不同的)问题指向一个主 Q&A 可以更容易地在未来找到主。

标签: python list


【解决方案1】:

您可以使用enumerateziplist comprehensions

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

【讨论】:

    【解决方案2】:
    [x - a[i-1] if i else None for i, x in enumerate(a)][1:]
    

    【讨论】:

      【解决方案3】:

      使用 itertools 文档中的 recipe for 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)
      

      像这样使用它:

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

      【讨论】:

      • 这完全没有必要。见Python - Differences between elements of a list
      • @Matt Ball:许多迭代器可以称为“不必要的”,但一旦定义,它们对于常见的习语就非常有用。当我们可以为pairwise 之类的想法指定一个有用的名称时,为什么还要让读者猜出两个切片的拉链。我不认为只有我一个人在想这个,因为我直接从文档中提取了这个例子。
      • +!此版本适用于无法切片/索引的任意生成器。
      猜你喜欢
      • 1970-01-01
      • 2019-12-13
      • 2019-05-17
      • 2020-05-23
      • 1970-01-01
      • 2011-01-24
      • 2012-04-23
      • 1970-01-01
      • 2019-08-01
      相关资源
      最近更新 更多