J'ai une chaîne avec des chiffres comme ça - digit = "7316717"

Maintenant, je veux diviser la chaîne de telle sorte que la sortie soit une fenêtre mobile de 3 chiffres à la fois. Je reçois donc -

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

Comment serait l'approche? La manière la plus simple est de mettre en boucle et d'itérer. Mais je pense qu'une fonction de chaîne de python intégrée peut le faire en moins de code. Connaissez-vous une telle approche?

12
Srikar Appalaraju 3 oct. 2011 à 17:56

4 réponses

Meilleure réponse

Les exemples itertools fournissent la fonction window cela ne fait que cela:

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

Exemple d'utilisation:

>>> ["".join(x) for x in window("7316717", 3)]
['731', '316', '167', '671', '717']
12
Shawn Chin 3 oct. 2011 à 14:00
digit = "7316717"
digit_sets = [digit[i:i+3] for i in range(len(digit)-2)]
0
Amber 3 oct. 2011 à 14:01

Il existe une très bonne recette pairwise dans docs itertools.

En le modernisant un peu pour les éléments n du groupe, j'ai fait ce code:

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

3
ovgolovin 2 déc. 2013 à 18:20
>>> s = "7316717"
>>> [s[i:i+3] for i in range(len(s)-2)]
['731', '316', '167', '671', '717']
9
Steven Rumbalski 3 oct. 2011 à 14:00