2011-10-03 128 views
10

的Python拆分字符串我有一串數字像這樣 - digit = "7316717"在移動窗口

現在我想串以這樣的方式輸出是在時間的3個位數的移動窗口拆分。所以,我得到 -

["731", "316", "167", "671", "717"]

的做法會如何呢?直截了當的方法是放置for循環和迭代。但我覺得一些內置的Python字符串函數可以用較少的代碼來實現。知道任何這樣的方法?

回答

10

itertools examples提供window功能做到了這一點:

from itertools import islice 
def window(seq, n=2): 
    "Returns a sliding window (of width n) over data from the iterable" 
    " s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...     " 
    it = iter(seq) 
    result = tuple(islice(it, n)) 
    if len(result) == n: 
     yield result  
    for elem in it: 
     result = result[1:] + (elem,) 
     yield result 

用法示例:

>>> ["".join(x) for x in window("7316717", 3)] 
['731', '316', '167', '671', '717'] 
+1

窗口?我使用Python 2.6.1,在我看不到窗口的itertools實現中。我在這裏做點什麼? –

+0

我對此感到抱歉。它不是itertools的一部分。上面顯示的'window'函數(取自鏈接文檔)是如何使用'islice()'創建通用'窗口'函數的一個例子。 –

+0

哦,好的。很酷...... –

5
>>> s = "7316717" 
>>> [s[i:i+3] for i in range(len(s)-2)] 
['731', '316', '167', '671', '717'] 
0
digit = "7316717" 
digit_sets = [digit[i:i+3] for i in range(len(digit)-2)] 
3

有一個非常好的食譜pairwiseitertools docs

現代化有點爲n元件組中,我在此代碼:

from itertools import tee, izip 

def window(iterable, n): 
    els = tee(iterable, n) 
    for i, el in enumerate(els): 
     for _ in xrange(i): 
      next(el, None) 
    return izip(*els) 


print(["".join(i) for i in window("2316515618", 3)]) 

的Python 2.7

+0

你說得對。這是可爭議的比islice版更令人愉快。巧妙地使用'tee'和'next'。 +1 –

+0

@Shawn Chin謝謝! – ovgolovin

+0

與此處提出的解決方案相同:http://stackoverflow.com/a/6822907/145400感謝你們兩位。我更喜歡@ ovgolovin的'enumerate'版本。但是,你應該花更多的空間,也許使用'xrange'而不是'range'。 –