2016-11-29 47 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