2015-05-03 61 views
1

我有這個功能函數返回的是連續的列表中的所有子序列

def conseq_sequences(li, length): 
    """ Takes a list and a length. Returns all sub-sequences in li that 
    are successice (e.g. [1,2,3] or [5,6,7,8]) and of the right length. 

    E.g. >>> conseq_sequences([1,6,7,8,9,8,9], length=3) 
      [[6,7,8], [7,8,9]] 
    """ 
    return [li[n:n + length] for n in range(len(li) - length + 1) 
      if li[n:n + length] == range(li[n], li[n] + length)] 

此功能存在於類,而我無法理解的方式這是行不通的。當我調用它時,我會得到一個空序列。

>>> conseq_sequences([1,6,7,8,9,8,9], length=3) 
[] 

有人能幫助使修改它,以便返回列表中是連續的所有子序列,如例子嗎?

+0

'我無法理解它不起作用的方式 - 你是什麼意思? – thefourtheye

+0

當我作出:conseq_sequences([1,6,7,8,9,8,9],長度= 3),它返回:[] – sss

+1

我得到'[[6,7,8],[7,8 ,9]]如預期。 – thefourtheye

回答

1

在Python 3.x中,range不會返回一個列表,而是一個範圍對象。

>>> range(1, 10) 
range(1, 10) 
>>> type(range(1, 10)) 
<class 'range'> 
>>> [1, 2, 3] == range(1, 4) 
False 
>>> [1, 2, 3] == list(range(1, 4)) 
True 

所以,你需要明確地將其轉換成一個列表,然後比較,這樣

[li[n:n + length] for n in range(len(li) - length + 1) 
    if li[n:n + length] == list(range(li[n], li[n] + length))] 

在這裏,我們創建了一個新的列表,由範圍對象轉換爲一個列表,

list(range(li[n], li[n] + length)) 

演示

Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> def conseq_sequences(li, length): 
...  """ Takes a list and a length. Returns all sub-sequences in li that 
...  are successice (e.g. [1,2,3] or [5,6,7,8]) and of the right length. 
... 
...  E.g. >>> conseq_sequences([1,6,7,8,9,8,9], length=3) 
...   [[6,7,8], [7,8,9]] 
...  """ 
...  return [li[n:n + length] for n in range(len(li) - length + 1) 
...    if li[n:n + length] == list(range(li[n], li[n] + length))] 
... 
>>> conseq_sequences([1, 6, 7, 8, 9, 8, 9], 3) 
[[6, 7, 8], [7, 8, 9]] 
+0

只有一個問題#thefourtheye:爲什麼我們沒有在範圍內創建一個列表(len(li) - length + 1)] – sss

+0

因爲我們只是在那裏迭代範圍對象。當我們將一個列表對象與另一個對象進行比較時,它也必須是一個列表對象。這就是爲什麼我們只在比較過程中進行轉換。 – thefourtheye

+0

我可以再問一件事,#thefourtheye?如果有一個用python2編寫的類,我應該轉換列表中的所有範圍對象嗎? – sss

相關問題