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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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']]
    >>>
    >>>

  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
    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

+ 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