【问题标题】:Python - find incremental numbered sequences with a list comprehension [duplicate]Python - 使用列表理解查找增量编号序列[重复]
【发布时间】:2013-04-25 06:37:52
【问题描述】:

我在列表中有一个数字序列,我正在寻找一个优雅的解决方案,最好是列表理解,以获取单个序列(包括单个值)。我已经解决了这个小问题,但它不是很pythonic。

以下列表定义了一个输入序列:

input = [1, 2, 3, 4, 8, 10, 11, 12, 17]

期望的输出应该是:

output = [
  [1, 2, 3, 4],
  [8],
  [10, 11, 12],
  [17],
]

【问题讨论】:

  • 一行中是否有两个相同的数字,即[1,2,2,3,5]
  • 不,所有数字都是唯一的,n + 1 将永远大于 n。

标签: python list list-comprehension


【解决方案1】:
>>> from itertools import groupby, count
>>> nums = [1, 2, 3, 4, 8, 10, 11, 12, 17]
>>> [list(g) for k, g in groupby(nums, key=lambda n, c=count(): n - next(c))]
[[1, 2, 3, 4], [8], [10, 11, 12], [17]]

【讨论】:

  • 你能预见未来吗?这真是……太棒了。
  • 它可以工作 - 但它不是真正自我解释的代码。
  • @HennyH: 不,c 是一个计数器,因此它为列表中的每个元素提供一个索引(01 等),然后根据它们之间的差异对值进行分组指数及其实际值。 [1, 2, 3, 4] 与它们的索引相差 1[8] 与它的索引相差 4,等等。
  • 我发现this blog post 展示了这种技术。以及之前在CodeReview 上的引用。
  • @jamylak:示例中的original commit 归功于 Guido 的想法,并于 2004 年制作。
【解决方案2】:

Pythonic 意味着简单、直接的代码,而不是单行代码。

def runs(seq):
    result = []
    for s in seq:
        if not result or s != result[-1][-1] + 1:
            # Start a new run if we can't continue the previous one.
            result.append([])
        result[-1].append(s)
    return result

print runs([1, 2, 3, 4, 8, 10, 11, 12, 17])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-20
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多