我有一个数字列表的序列,我正在寻找一种优雅的解决方案,最好使用列表推导式,以获取单个序列(包括单个值)。我已经解决了这个小问题,但这不是很Pythonic。
以下列表定义了一个输入序列:
input = [1, 2, 3, 4, 8, 10, 11, 12, 17]
期望的输出应为:
output = [
[1, 2, 3, 4],
[8],
[10, 11, 12],
[17],
]
我有一个数字列表的序列,我正在寻找一种优雅的解决方案,最好使用列表推导式,以获取单个序列(包括单个值)。我已经解决了这个小问题,但这不是很Pythonic。
以下列表定义了一个输入序列:
input = [1, 2, 3, 4, 8, 10, 11, 12, 17]
期望的输出应为:
output = [
[1, 2, 3, 4],
[8],
[10, 11, 12],
[17],
]
>>> 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]]
c
是一个计数器,它为列表中的每个元素分配一个索引(0、1 等),然后根据其索引和实际值之间的差异对值进行分组。 [1, 2, 3, 4]
的索引与其之间的差异均为 1
,[8]
与其索引相差 4
,等等。 - Martijn PietersPythonic指的是简单、直接的代码,而不是单行代码。
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])
[1,2,2,3,5]
? - TerryA