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 :

coversion string<-->list


Sujet :

Python

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Par défaut coversion string<-->list
    Bonjour a tous.
    Je dois creer une petite bibliotheque sur les polynomes ( donc j'ai pas le droit d'utiliser les fonctions predefinies sur les polynomes )
    Et ce qui me bloque est d'ecrire une fonction qui transforme une chaine de caracteres en une liste par exemple : pour la chaine '2x^7-36x^2+6x+1' la fonction doit renvoyer la liste : [1,6,-36,0,0,0,0,2] ( ou [2,0,0,0,0,-36,6,1])
    J'ai ecrit une fonction (mais qui ne marche pas malheureusement )

    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
     
    from string import *
    >>> l='2x^7-36x^2+6x+1'
    >>> y=split(l,'+')
    >>> y
    ['2x^7-36x^2', '6x', '1']
    >>> x=[split(y[i],'-') for i in range(len(y))]
    >>> x
    [['2x^7', '36x^2'], ['6x'], ['1']]
    >>> t=[x[i][j] for i in range(len(x)) for j in range(len(x[i]))]
    >>> t
    ['2x^7', '36x^2', '6x', '1']
    >>> z=[split(t[i],'x') for i in range(len(t)) ]
    >>> z
    [['2', '^7'], ['36', '^2'], ['6', ''], ['1']]
    >>> s=[z[i][j] for i in range(len(z)) for j in range(len(z[i]))]
    >>> s
    ['2', '^7', '36', '^2', '6', '', '1']
    >>> f=[split(s[i],'^') for i in range(len(s)) ]
    >>> f
    [['2'], ['', '7'], ['36'], ['', '2'], ['6'], [''], ['1']]
    >>> for i in range(len(h)-1,-1,-1):
    if h[i]=='':
    del(h[i])
    #ou encore (equivalent)
    >>> b=[]
    >>> for i in range(len(h)):
    if h[i]!='':
    b=b+[h[i]]
    >>> b
    ['2', '7', '36', '2', '6', '1']

    Ca me permet de recuperer les coefficients et les puissances mais je perds le signe des coefficients a la fin (le signe ' - ' )
    Toutes les indications sont les bienvenues.
    Merci d'avance.
    PS1:Je dois rendre mon projet dans peu de jours.
    PS2:Je ne suis que debutant en Python.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Par défaut
    Est-ce que la chaîne de caractères contenant le polynôme à traiter est ordonné ????
    Je m'explique : Est-ce que la puissance la plus élevée est tjs placée en dbt et la plus faible à la fin comme c'est le cas dans ton exemple '2x^7-36x^2+6x+1' ou ça peut être mélanger '-36x^2+2x^7+6x+1' ???

    Si elle est ordonnée se sera evidement plus simple mais si tu veux quelque chose de bien il faudrait faire une fonction qui traite le cas désordonné. Tout dépend de ta spec et/ou du tps qu'il te reste.

    Pour ton problème de signe, c'est plutôt normal puisque tu fait ton split au niveau des + et des - donc tu perd cette information.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Par défaut
    Salut Corpio.
    la chaine doit etre ordonnee ( on l' impose a l'utilisateur).

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Par défaut
    J'ai fait une petite fonction qui devrait t'aider (je ne te garantis pas que c'est la meilleure solution et qu'elle fonctionne pour tout les cas, il faudra donc effectuer différents tests).
    Si elle marche correctement il ne reste plus qu'à récupérer tous les coefficients présents et de rajouter les 0 si absents (selon les puissances présentes).

    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
    import string
    str = '2x^7-36x^2+6x+1'
     
    # Recherche des différentes parties du polynôme
    i = 0
    s = []
    for car in str:
        if car == '-' or car == '+':
            s.append(i)
        i+=1
     
    # Séparation des différentes parties du polynôme
    for j in range(len(s)):
        str = str[0:s[j]+j] + '%' + str[s[j]+j:len(str)]
    str = string.split(str,'%')
     
    # Parcours des différentes parties du polynôme
    for k in range(len(str)):
     
        # Ajout des x^n pour n=1 et n=0 si absent
        x = 0
        c = 0
        for car in str[k]:
            if car == 'x':
                x=1
            elif car == '^':
                c=1
        if x == 0:
            str[k] = str[k] + 'x^0'
        elif c == 0:
            str[k] = str[k] + '^1'
     
        # Suppression du signe + si présent en début de chaîne
        if str[k][0:1] == '+':
            str[k] = str[k][1:len(str[k])]
     
        # Séparation du coeffient et de la puissance
        str[k] = string.split(str[k],'x^')
     
    print str
     
    # Résultat :  [['2', '7'], ['-36', '2'], ['6', '1'] ['1', '0']]
    A mon avis tu devrais passer ces différentes chaines de caractères en int pour pouvoir faire des comparaisons entre les différentes puissances présentes.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Par défaut
    Merci Corpio t'es un chef !
    Mais je ne comprends pas quelques instructions :
    i+=1
    s.append(i)
    %
    if str[k][0:1] == '+' c'est la meme chose que if str[k][0] == '+' ?
    merci

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Par défaut
    if str[k][0:1] == '+' et if str[k][0] == '+' sont effectivement identiques (je ne sais pas pkoi j'ai fais çà !!! )

    Pour ce qui est du reste c'est quoi que ta pas compris, ce que fait la partie du code ou les instructions en elles-mêmes ????

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Par défaut
    Je ne comprends pas ce que font ces parties du code par ex i+=1 est-ce equivalent a i=i+1 ?
    meme chose pour les autres

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Par défaut
    i+=1 effectivement identique à i = i+1

    s est une liste (comme l'indique la déclaration s = [] )
    s.append(i) permet de rajouter l'élément i à la liste s

    i
    permet de repérer la position des signes + et - dans la chaîne de caractères (c'est un indice numérique).

    % est un caractère quelconque (j'aurais pu choisir autre chose !!) que je rajoute avant les signes (grâce aux indices i de la liste s) pour pouvoir effectuer le split sans perdre l'information des signes.


    C'est bon t'as tout compris ??

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Par défaut
    parfait !
    Merci beaucoup et bonne apres-midi.
    a+

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Par défaut
    Dans le cas ou str='x^7-x^6+x^5-x^3-x^2-x-1' , le programme de Corpio
    donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    >>>
    >>>
    >>> chaine_liste('x^7-x^6+x^5-x^3-x^2-x-1')
    [[' ', '7'], ['-', '6'], [' ', '5'], ['-', '3'], ['-', '2'], ['-', '1'], ['-1', '0']]
    >>>
    >>>
    Pour regler le probleme et afficher '-1' et '1' a la place de ' ' et '-' ,il faut ajouter a la fin du programme (avant print str ) ces instructions :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    for l in range(len(str)):
            if str[l][0]=='-':
                str[l][0]='-1'
            elif str[l][0]=='':
                str[l][0]='1'
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    >>>
    >>> 
    >>> chaine_liste('x^7-x^6+x^5-x^3-x^2-x-1')
    [['1', '7'], ['-1', '6'], ['1', '5'], ['-1', '3'], ['-1', '2'], ['-1', '1'], ['-1', '0']]
    >>>
    >>>

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Par défaut
    En effet il y a des exceptions à traiter dont celui que tu vient de parler, le cas où le coefficient est égal à 1.
    Un autre cas est à vérifier, celui où le coefficient de la plus grande puissance (càd le premier dans la liste) est négatif, dans ce cas il ne faut pas ajouter le % au début ce qui donne des problèmes avec le split.

    Il faut donc rajouter au début du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Recherche des différentes parties du polynôme
    i = 0
    s = []
    for car in str:
        if i<>0 and (car == '-' or car == '+'):
            s.append(i)
        i+=1

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 56
    Par défaut
    Salut ;
    Merci beaucoup , ca a l'air de marcher !
    a+

  13. #13
    Membre averti
    Enseignant
    Inscrit en
    Avril 2006
    Messages
    31
    Détails du profil
    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2006
    Messages : 31
    Par défaut
    Salut,

    Je ne comprend pas bien le i<>0 , tu peux expliquer ? ... je n'ai jamais rencontré <> dans un code .

    a+

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Par défaut
    i <> 0 est vraie si la valeur de i est différente de zéro

  15. #15
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864
    Par défaut
    mieux vaut utiliser la notation i != 0

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 119
    Par défaut
    Cela fait maintenant 5 semaines que j'ai commencé à programmer en Python. Je suis partie d'un code existant qui utilisait la notation <>. Moi même, j'étais habitué à != avec le langage C++ mais ayant déjà vu la première notation dans d'autres langages je n'ai pas été choqué de le retrouver en Python et je n'ai donc pas essayé l'autre notation.

    Y a-t-il une réel différence entre les 2 notations ???
    Pour quoi != aurait plus sa place que <> ???

  17. #17
    Expert confirmé
    Avatar de Guigui_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    1 864
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Saône et Loire (Bourgogne)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 1 864

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

Discussions similaires

  1. probleme d'affichage avec les string d'1 liste chainee
    Par ghyslain dans le forum Débuter
    Réponses: 5
    Dernier message: 29/09/2009, 11h15
  2. Réponses: 3
    Dernier message: 16/07/2008, 10h41
  3. inserer une string dans une liste de string
    Par la_reine dans le forum Débuter avec Java
    Réponses: 5
    Dernier message: 14/05/2008, 08h07
  4. Réponses: 6
    Dernier message: 14/07/2007, 11h36
  5. Conversion String Collection en List <String>
    Par Seth77 dans le forum Framework .NET
    Réponses: 2
    Dernier message: 21/11/2006, 09h57

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