不知道如何命名这种模式,但通过实例我认为更容易解释。
例如,假设我有这个列表:
lst = [1, 2, 3, 5, 6, 7, 8, 10, 11, 15]
所以现在我需要合并一部分列表,增加一个(意味着只保留第一个和最后一个项目),但如果这样的增量中只有两个项目,则没有任何合并,因为它们都是第一个以及这种模式的最后一项。
因此,通过运行一些处理此问题的方法,它应该将其分开:
merged = [(1, 3), (5, 8)]
original = [10, 11, 15]
原始列表注释。它仅包含这三项,因为2
,6
和7
已合并(它们与该模式匹配)。 10
和11
增加一个增量,但只有两个数字,因此无需合并。并且15
根本不匹配任何模式。
我想在迭代时使用第一和第二项的一些比较,但算法变得复杂,我无法正确合并/分离这些项目。
P.S。
原因是我有一个生成Excel报告的模块。并且可以指定公式如何计算某些行(在Excel侧)。
现在,当前功能返回特定的(当在一个公式中使用工作表的单独部分时)行数。因此,例如,公式最终可能会出现:"sum(A1, A2, A3, A5)"
。如果有很多行,实际表达式可能变得非常大。但如果我可以通过为exmaple "sum(A1:A3, A5)"
设置相同的公式来简化它,那就不会那么大了。
答案 0 :(得分:0)
所以我的问题似乎与此处的问题非常相似(问题由Chris_Rands发现): Identify groups of continuous numbers in a list
虽然为了完整性,这里是解决我问题的答案的修改版本:
from operator import itemgetter
from itertools import groupby
def merge_ranges(data):
ranges = []
origin = []
for key, group in groupby(
enumerate(data), lambda (index, item): index - item):
group = map(itemgetter(1), group)
if len(group) > 2:
ranges.append((group[0], group[-1]))
else:
origin.extend(group)
return ranges, origin