IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Programmation multimédia/Jeux Python Discussion :

Boucle for et range ?


Sujet :

Programmation multimédia/Jeux Python

  1. #1
    Membre à l'essai
    Femme Profil pro
    Lycéen
    Inscrit en
    Mars 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 38
    Points : 11
    Points
    11
    Par défaut Boucle for et range ?
    Bonjour,

    Je vous expose mon problème, j'ai une chaine de caractère, par exemple : vwnrvbmso.

    J'aimerais obtenir dans l'ordre la chaine après opération suivante : msorvbvwn. L'opération consiste donc à prendre la chaîne par la fin et tout les 3 pas afficher les caractères qui suivent.

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2013
    Messages
    388
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2013
    Messages : 388
    Points : 692
    Points
    692
    Par défaut
    Salut,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>> ch = 'vwnrvbmso'
    >>> ch_cut = [ch[i:i + 3] for i in range(0, len(ch), 3)]
    >>> ch_cut
    ['vwn', 'rvb', 'mso']
    >>> ''.join(ch_cut[::-1])
    'msorvbvwn'
    >>>

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Autre solution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    from textwrap import wrap
     
    chaine = "vwnrvbmso"
     
    listWords = wrap(chaine, 3)[::-1]
    print(''.join(listWords))
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Membre à l'essai
    Femme Profil pro
    Lycéen
    Inscrit en
    Mars 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 38
    Points : 11
    Points
    11
    Par défaut
    Merci à vous deux, mais je crois que j'ai choisi un mauvais exemple... En effet, j'ai voulu appliquer cette méthode sur une chaine plus longue : 577ab9c9aeff277fff0000000000ff00ff00ff0000000000ba4b98fefefe000100000000. Pour cette chaine j'aurai voulu faire des groupes de 6 et que tout les 3 paquets de 6 (toujours en partant de la fin) on affiche les caracteres. Par exemple, on obtiendrait : fefefe000100000000 ff0000000000ba4b98 0000000000ff00ff00 et ainsi de suite..

    Je veux réaliser cette opération car je travaille sur des images BMP, et que j'ai récuperé les données hexadecimale (cf la chaine de caractère ci-dessus). Le problème étant que la spécification du format BMP impose de lire l'image à l'envers, de bas en haut et de gauche à droite.

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Si tu as compris nos codes, tu as compris comment séparer en plusieurs groupes.

    Si tu veux séparer en 3 groupes, tu dois connaître la longueur de la chaîne et diviser cette longueur par 3.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    from textwrap import wrap
     
    chaine = "577ab9c9aeff277fff0000000000ff00ff00ff0000000000ba4b98fefefe000100000000"
     
    taille = len(chaine)
     
    print("chaine : ", chaine)
     
    print("taille de la chaîne : ", taille)
     
    print("longueur de la chaîne pour 3 groupes : ", int(taille/3))
     
    for ind, groupe in enumerate(wrap(chaine, int(taille/3))):
        print("groupe {}: ".format(ind), groupe)
    Ce qui donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    chaine :  577ab9c9aeff277fff0000000000ff00ff00ff0000000000ba4b98fefefe000100000000
    taille de la chaîne :  72
    longueur de la chaîne pour 3 groupes :  24
    groupe 0:  577ab9c9aeff277fff000000
    groupe 1:  0000ff00ff00ff0000000000
    groupe 2:  ba4b98fefefe000100000000
    On peut construire maintenant une fonction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    from textwrap import wrap
     
    def getGroups(myString, groups):
        length = len(myString)
     
        if length%groups != 0:
            raise ValueError("length % groups != 0")
     
        lengthOfString = int(length/groups)
     
        return wrap(myString, lengthOfString)[::-1]
     
    def displayGroup(groups):
        for ind, group in enumerate(groups):
            print("group {}: ".format(ind+1), group)
     
    chaine = "577ab9c9aeff277fff0000000000ff00ff00ff0000000000ba4b98fefefe000100000000"
     
    groups = getGroups(chaine, 3)
    displayGroup(groups)
    Ce qui donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    group 1:  ba4b98fefefe000100000000
    group 2:  0000ff00ff00ff0000000000
    group 3:  577ab9c9aeff277fff000000
    Dans ton exemple, on utilise 4 groupes, soit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    groups = getGroups(chaine, 4)
    displayGroup(groups)
    Résultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    group 1:  fefefe000100000000
    group 2:  ff0000000000ba4b98
    group 3:  0000000000ff00ff00
    group 4:  577ab9c9aeff277fff
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Membre à l'essai
    Femme Profil pro
    Lycéen
    Inscrit en
    Mars 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 38
    Points : 11
    Points
    11
    Par défaut
    Merci pour ta reponse.
    J'ai une autre question à te poser
    Comment faire pour que tout les 9 caractere d'une chaine, j'ajoute des 0 tant que la chaine n'est pas un multiple de 4 ?
    J'ai fait le code ci-dessous, mais encore une fois je ne sais pas comment faire avec une chaine plus longue. J'ai bien sûr essayé d'utiliser vos méthode avec la fonction range et ses paramètre mais j'obtiens une erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    chaine = "010000010"
    print(len(chaine))
    while len(chaine)%4 != 0:
    	chaine = chaine +'0'
    print(len(chaine))
    print(chaine)
    J'obtiens :

    Ce à quoi je m'attendais. Mais avec une chaine plus c'est une autre histoire..


    merci

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Ça me semble correct, tu as quoi comme erreur ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Membre à l'essai
    Femme Profil pro
    Lycéen
    Inscrit en
    Mars 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 38
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    J'ai finalement résolu mon problème, merci.

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 6
    Points : 16
    Points
    16
    Par défaut
    Salut,

    une solution qui marchera dans la plupart des cas et qui se charge des valeurs manquantes (c/c de grouper https://docs.python.org/2/library/it...s.html#recipes)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    import itertools
     
    def grouper(iterable, n, fillvalue=None):
        "Collect data into fixed-length chunks or blocks"
        # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx
        args = [iter(iterable)] * n
        return itertools.izip_longest(fillvalue=fillvalue, *args)
     
    chaine = "577ab9c9aeff277fff0000000000ff00ff00ff0000000000ba4b98fefefe000100000000"
    # Groupes de 6 éléments
    groups = [''join(g) for g in grouper(chaine, 6)]
    # Groupes de 3 en partant de la fin
    groups2 = grouper(groups[::-1], 3)

    Pour le coup de la chaîne de 9 caractères dans tous les cas ton code renverra une nouvelle chaîne de 12 caractères autant faire directement chaine + '000' au lieu de faire une boucle

Discussions similaires

  1. [XL-2013] Décrémenter une boucle For Each Cell in Range ?
    Par ldubs dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 09/12/2014, 17h41
  2. [XL-2003] VBA problème avec la une boucle for range.end(xlup).row après suppression de lignes
    Par JohnNC115 dans le forum Macros et VBA Excel
    Réponses: 21
    Dernier message: 25/01/2011, 10h21
  3. aide vba boucle for each paramétrée en range
    Par gotlieb dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/07/2006, 08h55
  4. [Swing][boucles] for, do, if .....comment faire simple?
    Par chastel dans le forum AWT/Swing
    Réponses: 7
    Dernier message: 02/05/2004, 22h49
  5. [langage] boucle "for" modification du pas
    Par K-ZimiR dans le forum Langage
    Réponses: 4
    Dernier message: 29/04/2004, 11h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo