Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将连续的数字序列附加到列表中_Python - Fatal编程技术网

Python 将连续的数字序列附加到列表中

Python 将连续的数字序列附加到列表中,python,Python,我想有一个连续的数字序列列表 我有一个排序的整数列表,如下所示 [1,2,3,4,6,7,9,10,12,13,14,17,18,19,21] 我似乎找不到一个合适的算法来解决这个问题(查阅了DP,但这和我的情况不一样) 我想要这样的输出 [[1,2,3,4],[6,7],[9,10],[12,13,14],[17,18,19],[21]您可以使用此选项。它通过使用范围差对连续运行进行分组,以便所有递增的数字都显示在同一组中 演示: from operator import itemgetter

我想有一个连续的数字序列列表

我有一个排序的整数列表,如下所示
[1,2,3,4,6,7,9,10,12,13,14,17,18,19,21]

我似乎找不到一个合适的算法来解决这个问题(查阅了DP,但这和我的情况不一样)

我想要这样的输出
[[1,2,3,4],[6,7],[9,10],[12,13,14],[17,18,19],[21]

您可以使用此选项。它通过使用范围差对连续运行进行分组,以便所有递增的数字都显示在同一组中

演示:

from operator import itemgetter
from itertools import groupby

data = [1,2,3,4,6,7,9,10,12,13,14,17,18,19,21]

result = [list(map(itemgetter(1), g)) for _, g in groupby(enumerate(data), lambda x: x[0] - x[1])]

print(result)
[[1, 2, 3, 4], [6, 7], [9, 10], [12, 13, 14], [17, 18, 19], [21]]
输出:

from operator import itemgetter
from itertools import groupby

data = [1,2,3,4,6,7,9,10,12,13,14,17,18,19,21]

result = [list(map(itemgetter(1), g)) for _, g in groupby(enumerate(data), lambda x: x[0] - x[1])]

print(result)
[[1, 2, 3, 4], [6, 7], [9, 10], [12, 13, 14], [17, 18, 19], [21]]

为了获得更好的性能,您可能希望尝试使用numpy。首先使用获取第一个差异大于
1
的索引,然后使用它们将数组拆分为多个块:


有一种方法可以做到这一点:

nums = [1, 2, 3, 4, 6, 7, 9, 10, 12, 13, 14, 17, 18, 19, 21]
# Find sequence boundaries
splits = [i + 1 for i, (n1, n2) in enumerate(zip(nums, nums[1:])) if n1 + 1 != n2]
splits.insert(0, 0)
splits.append(len(nums))
# Make subsequences
seqs = [nums[s1:s2] for s1, s2 in zip(splits, splits[1:])]
print(seqs)
# [[1, 2, 3, 4], [6, 7], [9, 10], [12, 13, 14], [17, 18, 19], [21]]
或者,如果您更喜欢“传统”for循环:

nums = [1, 2, 3, 4, 6, 7, 9, 10, 12, 13, 14, 17, 18, 19, 21]
seqs = [[nums[0]]]
for n in nums[1:]:
    if n != seqs[-1][-1] + 1:
        seqs.append([n])
    else:
        seqs[-1].append(n)
print(seqs)
# [[1, 2, 3, 4], [6, 7], [9, 10], [12, 13, 14], [17, 18, 19], [21]]

它的效率不如numpy,但您可以使用functools中的reduce():

nums = [1, 2, 3, 4, 6, 7, 9, 10, 12, 13, 14, 17, 18, 19, 21]

from functools import reduce

groups = reduce(lambda a,b: a+[[b]] if a[-1][-1]!=b-1 else a[:-1]+[a[-1]+[b]],nums[1:],[nums[:1]])

# [[1, 2, 3, 4], [6, 7], [9, 10], [12, 13, 14], [17, 18, 19], [21]]

因此,迭代列表并寻找断点?使用numpy是一个选项吗?@yatu是的:)我接受了这个答案,因为NP阵列性能更好。但我想强调一点,@jdehesa解决方案也很棒而且优雅!