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

Python Discussion :

optimisation découpage de chaine


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Février 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 30
    Par défaut optimisation découpage de chaine
    Bonjour,
    Je cherche à découper une chaine "5379626173" en une liste
    list = [53,79,62,61,73].

    Voici le code que j'utilise mais je pense qu'il existe plus simple et/ou plus rapide.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    mystring="5379626173"
    mylist = []
    for i in range(0,len(mystring),2):
        j = i + 2
        mylist.append(mystring[i:j])
    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Il y a peut-être encore plus court, mais commence déjà par ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mylist = [mystring[i:i+2] for i in range(0,len(mystring),2)]
    Tyrtamos

  3. #3
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    In [9]: re.findall(r'\d{2}', '5379626173')
    Out[9]: ['53', '79', '62', '61', '73']

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut Si la chaine est de longueur invariable
    Il faut transférer de l'exécution du programme dans l'écriture du programme une partie du travail qui doit être effectué, et à ce moment là on gagne en vitesse.

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    rom timeit import Timer
    import re
     
    c = "5379626173"
    repet = 4 # nombre de calculs de temps effectues
    ITERATIONS = 1000000 # nombre d'iterations de la fonction pour un calcul de temps
     
    def gnuv(c):
        lgnuv = re.findall(r'\d{2}', c)
        return lgnuv
     
    def alex(c):
        mylist = []
        for i in range(0,10,2):
            j = i + 2
            mylist.append(c[i:j])
        return mylist
     
    def tyrt(string):
        list = [c[i:i+2] for i in range(0,10,2)]
        return list
     
    def eyqu(c):
        li = [c[0:2],c[2:4],c[4:6],c[6:8],c[8:10]]
        return li
     
     
     
    Timergnuv = Timer('alex(c)','from __main__ import alex, c')
    tgnuv = Timergnuv.repeat(repet,ITERATIONS)
    tmoy = 0
    for i in tgnuv:
        tmoy = tmoy + i
    tmoy = tmoy/repet
    print "Avec  re.findall(r'\d{2}', c)\n"
    for i in [float(str(t)[0:5]) for t in tgnuv]:
        print '\t',i,
    print '\n\tmoyenne =',float(str(tmoy)[0:5])
    print '\tminimum =',float(str(min(tgnuv))[0:5])
    print'\n\n'
     
     
    Timeralex = Timer('alex(c)','from __main__ import alex, c')
    talex = Timeralex.repeat(repet,ITERATIONS)
    tmoy = 0
    for i in talex:
        tmoy = tmoy + i
    tmoy = tmoy/repet
    print 'Avec  mylist.append(c[i:j])\n'
    for i in [float(str(t)[0:5]) for t in talex]:
        print '\t',i,
    print '\n\tmoyenne =',float(str(tmoy)[0:5])
    print '\tminimum =',float(str(min(talex))[0:5])
    print'\n\n'
     
    Timertyrt = Timer('tyrt(c)','from __main__ import tyrt, c')
    ttyrt = Timertyrt.repeat(repet,ITERATIONS)
    tmoy = 0
    for i in ttyrt:
        tmoy = tmoy + i
    tmoy = tmoy/repet
    print 'Avec  list = [c[i:i+2] for i in range(0,10,2)]\n'
    for i in [float(str(t)[0:5]) for t in ttyrt]:
        print '\t',i,
    print '\n\tmoyenne =',float(str(tmoy)[0:5])
    print '\tminimum =',float(str(min(ttyrt))[0:5])
    print'\n\n'
     
    Timereyqu = Timer('eyqu(c)','from __main__ import eyqu, c')
    teyqu = Timereyqu.repeat(repet,ITERATIONS)
    tmoy = 0
    for i in teyqu:
        tmoy = tmoy + i
    tmoy = tmoy/repet
    print 'Avec  li = [c[0:2],c[2:4],c[4:6],c[6:8],c[8:10]]\n'
    for i in [float(str(t)[0:5]) for t in teyqu]:
        print '\t',i,
    print '\n\tmoyenne =',float(str(tmoy)[0:5])
    print '\tminimum =',float(str(min(teyqu))[0:5])
    print'\n\n\n'

    Résultat:
    il s'agit de temps d'exécution de 1000000 d'itérations de calcul de la liste voulue, en secondes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Avec  re.findall(r'\d{2}', c)
    	34.14 	34.32 	32.78 	31.21 
    	moyenne = 33.11
    	minimum = 31.21
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Avec  mylist.append(c[i:j])
    	29.37 	34.1 	33.73 	34.12 
    	moyenne = 32.83
    	minimum = 29.37
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Avec  list = [c[i:i+2] for i in range(0,10,2)]
    	26.03 	25.6 	25.57 	26.33 
    	moyenne = 25.88
    	minimum = 25.57
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Avec  li = [c[0:2],c[2:4],c[4:6],c[6:8],c[8:10]]
    	8.537 	8.469 	8.603 	8.685 
    	moyenne = 8.573
    	minimum = 8.469

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 418
    Par défaut Si la chaine est de longueur variable
    Il suffit de créer une fonction du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def f(c):
        if len(c)==6:
            return [[c[0:2],c[2:4],c[4:6]]
        if len(c)==8:
            return [[c[0:2],c[2:4],c[4:6],c[6:8]]

  6. #6
    Membre émérite
    Avatar de GnuVince
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2004
    Messages
    679
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2004
    Messages : 679
    Par défaut
    Citation Envoyé par eyquem Voir le message
    Il suffit de créer une fonction du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def f(c):
        if len(c)==6:
            return [[c[0:2],c[2:4],c[4:6]]
        if len(c)==8:
            return [[c[0:2],c[2:4],c[4:6],c[6:8]]
    Pas super si on ne connaît pas les longueurs possible de c

  7. #7
    Membre averti
    Inscrit en
    Février 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 30
    Par défaut
    Réponse impréssionnante !
    Merci pour ce travail de recherche et d'analyse que je n'aurai pas pu faire moi même mais que je conserve pour exemple.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Découpage de chaine de caractères
    Par fabpeden dans le forum C
    Réponses: 3
    Dernier message: 07/05/2007, 11h50
  2. Un petit découpage de chaine
    Par Woodgate dans le forum Langage
    Réponses: 2
    Dernier message: 30/12/2006, 15h55
  3. Pl/Sql , 8i , découpage de chaine de caractères
    Par Youby dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/05/2006, 00h54
  4. Découpage de chaine
    Par vodevil dans le forum Langage
    Réponses: 2
    Dernier message: 18/12/2005, 17h25
  5. Découpage de chaine de caractère
    Par tcharles dans le forum C++
    Réponses: 11
    Dernier message: 23/08/2004, 14h34

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