2016-11-29 59 views
-3

不知道如何命名这种模式,但通过例子,我认为这更容易解释。Python - 合并与其他列表中的特定模式匹配的子列表?

比如让说我有这个名单:

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

所以现在我需要合并由一个增量变(也就是只有第一项和最后一项AR保持)列表的一部分,但只要有两个项目在这样的增量中,没有什么可以合并,因为它们都是这种模式的第一个和最后一个项目。原来名单上

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

注:

通过运行一些处理这种方法,应该就在这分开。它只有这三个项目,因为2,67被合并(它们符合该模式)。 1011只有一个增量,但只有两个数字,所以没有任何合并。而15完全不符合任何模式。

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

P.S.

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

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

+0

@UrielEli我真的没有什么工作可以展示,所以我不知道这会有多大用处,但是如果你认为这会有所帮助,我会提供一些东西。 – Andrius

+0

它有趣的如何从问题的人http://stackoverflow.com/questions/2154249/identify-groups-of-continuous-numbers-in-a-list得到44票,我downvoted不提供任何示例代码(虽然两个问题的情况都是一样的)。这是一种双重标准吗?:) – Andrius

回答

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