Python - 合并与另一个列表中某些模式匹配的子列表?

时间:2016-11-29 14:51:04

标签: python list

不知道如何命名这种模式,但通过实例我认为更容易解释。

例如,假设我有这个列表:

lst = [1, 2, 3, 5, 6, 7, 8, 10, 11, 15]

所以现在我需要合并一部分列表,增加一个(意味着只保留第一个和最后一个项目),但如果这样的增量中只有两个项目,则没有任何合并,因为它们都是第一个以及这种模式的最后一项。

因此,通过运行一些处理此问题的方法,它应该将其分开:

merged = [(1, 3), (5, 8)]
original = [10, 11, 15]

原始列表注释。它仅包含这三项,因为267已合并(它们与该模式匹配)。 1011增加一个增量,但只有两个数字,因此无需合并。并且15根本不匹配任何模式。

我想在迭代时使用第一和第二项的一些比较,但算法变得复杂,我无法正确合并/分离这些项目。

P.S。

原因是我有一个生成Excel报告的模块。并且可以指定公式如何计算某些行(在Excel侧)。

现在,当前功能返回特定的(当在一个公式中使用工作表的单独部分时)行数。因此,例如,公式最终可能会出现:"sum(A1, A2, A3, A5)"。如果有很多行,实际表达式可能变得非常大。但如果我可以通过为exmaple "sum(A1:A3, A5)"设置相同的公式来简化它,那就不会那么大了。

1 个答案:

答案 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