Python - 使用列表推导式查找递增编号序列

12

我有一个数字列表的序列,我正在寻找一种优雅的解决方案,最好使用列表推导式,以获取单个序列(包括单个值)。我已经解决了这个小问题,但这不是很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] - TerryA
不,所有的数字都是唯一的,而且 n + 1 总是大于 n。 - skovsgaard
2个回答

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

1
你能看到未来吗?那太神奇了。 - TerryA
1
它可以工作 - 但它的代码并不是十分自我解释。 - Howard
3
@HennyH:不,c 是一个计数器,它为列表中的每个元素分配一个索引(0、1 等),然后根据其索引和实际值之间的差异对值进行分组。 [1, 2, 3, 4] 的索引与其之间的差异均为 1[8] 与其索引相差 4,等等。 - Martijn Pieters
1
我发现了这篇博客文章,展示了这种技术。还有早期的参考资料在CodeReview上。 - Martijn Pieters
1
@jamylak:而且这个示例的原始提交归功于Guido的想法,是在2004年制作的。 - Martijn Pieters
显示剩余13条评论

8

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接