2014-05-08 57 views
1

什麼是將一組整數轉換爲範圍的最常用pythonic方式(對此問題已存在converting a list of integers into range in python)但有某種可接受的邊距?將整數轉換爲範圍但帶有允許的孔

實施例,我們有: 1,2,3,4,5,10,11,15,45,46,47,75,76,80,85

因此通常我們將得到: {1,5},{10,11},{15,15},{45,47},{75,76},{80,80},{85,85}

但我們想允許如果上一個項目與下一個項目之間的差異大於20,則將創建下一個範圍

因此,我們應該得到: {1,15},{45,47},{75, 85}

+7

如果您可以從提供您當前的解決方案開始,我們可以確定是否有更多可用的Pythonic替代方案。 – chepner

+1

如果您正在尋找對工作代碼的評論/改進,那就是http://codereview.stackexchange.com上的主題 – jonrsharpe

+0

我懷疑你是從「填充小於N的序列中的任何孔開始」,然後創建名單。這意味着 - 找到「相反」集 - 數字不包含;使用鏈接中的方法查找運行長度;刪除運行長度大於N的那些;然後合併這兩組。 – Floris

回答

1
def to_ranges(nums): 
    rngs = [] 
    start = nums[0] 
    curr = start 
    for n in nums[1:]: 
    if n > curr + 20: 
     rngs.append(range(start, curr + 1)) 
     start = n 
    curr = n 
    rngs.append(range(start, curr + 1)) 
    return rngs 

>>> to_ranges([1, 2, 3, 4, 5, 10, 11, 15, 45, 46, 47, 75, 76, 80, 85]) 
[range(1, 16), range(45, 48), range(75, 86)]