2011-10-03 10 views
10

movimento Ho una stringa con cifre in questo modo - digit = "7316717"Python stringa di spaccatura nella finestra

Ora voglio dividere la stringa in modo tale che l'uscita è una finestra mobile di 3 cifre alla volta. Così ho -

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

Come sarebbe l'approccio essere? Il modo semplice è di mettere in loop e iterare. Ma ritengo che alcune funzioni di stringa di python incorporate possano farlo in meno codice. Conosci un simile approccio?

risposta

10

Il itertools examples fornisce la funzione window che fa proprio questo: Utilizzo

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 

Esempio:

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

finestra? Io uso Python 2.6.1, nella mia implementazione itertools non vedo la finestra. sto sbagliando qualcosa qui? –

+0

Le mie scuse per la confusione. Non fa parte di itertools. La funzione 'window' mostrata sopra (tratta dal documento collegato) è un esempio di come usare' islice() 'per creare una generica funzione' window'. –

+0

oh ok. cool .... –

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

V'è una molto buona ricetta pairwise in itertools docs.

Modernizzare un po 'per n elementi nel gruppo, ho fatto questo codice:

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

Hai ragione. È discutibile più piacevole della versione di islice. Uso intelligente di 'tee' e' next'. +1 –

+0

@Shawn Chin Grazie! – ovgolovin

+0

La stessa soluzione proposta qui: http://stackoverflow.com/a/6822907/145400 Grazie a tutti e due. Mi piace la versione di 'enumerate' di @ ovgolovin di più. Dovresti, comunque, spendere qualche altro spazio e magari usare 'xrange' invece di' range'. –

Problemi correlati