簡體   English   中英

返回列表中所有連續子序列的函數

[英]Function that returns all sub-sequences in a list that are successive

我有這個功能

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)
[]

有人可以幫忙進行修改,以便返回列表中連續的所有子序列,例如在示例中?

在Python 3.x中, range不返回列表,而是一個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]]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM