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 :

réciproque de str


Sujet :

Python

  1. #1
    Membre à l'essai
    Homme Profil pro
    master2 math
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : master2 math

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Points : 11
    Points
    11
    Par défaut réciproque de str
    Bonjour



    existe t'il une fonction (appelons la f) telle que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>>a=str([0,1])
    >>> a
    '[0, 1]'
    >>> f(a)
    [0, 1]

    de façon générale, peut-on "enlever les guillemets" quel que soit l'expression entre guillemets

    (je n'ai lu que des cas où entre guillemets, on a un entier, ou un décimal, et les fonctions de conversions sont différentes selon ces deux type (int() et float()))

    merci beaucoup!

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 462
    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 462
    Points : 9 249
    Points
    9 249
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Quand on est sûr que c'est un nombre, on utilise int ou float:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print(int('55'))
    55
    print(float('55.3'))
    55.3
    Dans les autres cas, on utilise eval, mais ce n'est pas recommandé pour des raisons de sécurité: si la chaine de caractères vient de l'extérieur, elle peut contenir des instructions dangereuses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print(eval('[0,1]'))
    [0,1]
    A noter que eval permet surtout de calculer des expressions mathématiques passées sous forme de chaines de caractères:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print(eval('3*89.21/12**3'))
    0.15487847222222223
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    je me risquerai à dire eval ?

    Edit: pris de vitesse par tyrtamos

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    "eval" certes mais c'est plutôt l'inverse de "repr" (que celui de "str").

    De façon générale, transformer un objet (Python) en chaîne de caractère est une opération de sérialisation. Il est préférable d'utiliser les modules json (pour les structures simples) et pickle (pour les objets Python complexes) plutôt qu'eval/repr à la fois pour s'eviter des problème de sécurité et ne pas recoder ce qui existe déjà.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre expérimenté Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Points : 1 481
    Points
    1 481
    Par défaut
    Citation Envoyé par MatheuxNoviceEnProg Voir le message
    Bonjour

    existe t'il une fonction (appelons la f) telle que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>>a=str([0,1])
    >>> a
    '[0, 1]'
    >>> f(a)
    [0, 1]
    ouh là ...

    Quand tu écris [0, 1] tu penses à la liste python contenant les deux entiers 0 et 1 ou à l'intervalle mathématique allant de 0 à 1 (dans N, Z, R, ...) ?
    "La simplicité ne précède pas la complexité, elle la suit." - Alan J. Perlis
    DVP ? Pensez aux cours et tutos, ainsi qu'à la FAQ !

  6. #6
    Membre à l'essai
    Homme Profil pro
    master2 math
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : master2 math

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Merci pour ces super réponses!!

    Citation Envoyé par tyrtamos Voir le message
    Bonjour,

    Quand on est sûr que c'est un nombre, on utilise int ou float:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    print(int('55'))
    55
    print(float('55.3'))
    55.3
    Dans les autres cas, on utilise eval, mais ce n'est pas recommandé pour des raisons de sécurité: si la chaine de caractères vient de l'extérieur, elle peut contenir des instructions dangereuses.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print(eval('[0,1]'))
    [0,1]
    merci pour la petite info au passage sur le pas recommandé, même si j'en suis pas encore au niveau où c'est dangereux, c'est toujours bon de savoir des trucs à l'avance^^ : je n'étais pas sûr de comprendre si dans "autre cas", "autre" était inclusif...et donc j'ai vérifié....et ça marche aussi, pour le cas où a est un entier ou un décimal.... je me suis dit :

    "la fonction eval est telle que !" pour tout a ...

    mais en regardant

    A noter que eval permet surtout de calculer des expressions mathématiques passées sous forme de chaines de caractères:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print(eval('3*89.21/12**3'))
    0.15487847222222223
    ...là je me suis dit non... ce n'est pas vraiment la réciproque "pour tout a"....mais en fait peut-être que si ; car

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> a=3*89.21/12**3
    >>> eval (str(a))
    0.15487847222222223
    >>> a
    0.15487847222222223
    Mais en fait ça ne marche pas!!

    Déjà on a
    qui donne un message d'erreur (je ne sais pas si c'est le bon terme "message d'erreur", j'ai entendu dire "exception")

    mais ça fait donc que la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    >>> def estCeEgal(a):
    	return eval (str(a))
    est "définie pour moins de valeurs" que la fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def egal (a):
    	return a
    à la limite ça ne me gêne pas pour dire que egal et estCeEgal sont égales aux messages d'erreurs près (je me risquerais à dire à "exception près"^^?)

    mais en fait non , comme le montre l'exemple, on peut avoir deux retours differents sans qu'il y ait un message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> x="'azerty'"
    >>> egal(x)
    "'azerty'"
    >>> estCeEgal(x)
    'azerty'
    Je vais maintenant tester la fonction donnée par W. mais il faut que je retourne à la discussion pour mettre son nom complet^^ et pour voir le nom de la fonction^^, cette partie du message est donc toute provisoire lol^^

    (j'espère que j'ai pas l'air d'un taré, avec ce genre de préoccupations^^, je dirai plus tard pourquoi, dans la pratique je me suis posé cette question, c'est en rapport avec setqui apparemment n'accepte pas tous les types, contrairement aux listes : comme on le voit ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    set([[0,1],1])
    Traceback (most recent call last):
      File "<pyshell#45>", line 1, in <module>
        set([[0,1],1])
    TypeError: unhashable type: 'list'
    >>>
    )

  7. #7
    Membre à l'essai
    Homme Profil pro
    master2 math
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : master2 math

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    ce message était en double!! (dû je crois aux réponses simultanées)
    [zut je viens de me rendre compte que j'ai pas détruis le bon jumeau!]
    du coup je complète ici même :
    comme vous disiez(*), wiztricks!

    "eval" certes mais c'est plutôt l'inverse de "repr" (que celui de "str").
    quand on définit ces trois fonctions


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    def W(a):
    	return eval(repr(a))
     
    >>> def egal(a) :
    	return a
     
    >>> def estCeEgal (a):
    	return eval(str(a))
    ...la fonction W se comporte exactement comme la fonction égal et retourne la même valeur (sauf quand on entre une variable pas définie et qu'on a dans les trois cas un message d'erreur en rouge ) , alors que la fonction estCeEgal se voit retourner un message d'erreur en rouge pour certaines valeurs où tout se déroule bien pour les deux autres fonctions, il y a surtout des cas où estCeEgal ne retourne pas la valeur initiale!!

    a part pour la valeur a le comportement de W et estCeEgal est différents sur chacun de ces exemples
    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
    >>> x="azerty"
    >>> y="'azerty'"
    >>> a=3
    >>> b="3"
    >>> W(x)
    'azerty'
    >>> estCeEgal(x)
    Traceback (most recent call last):
      File "<pyshell#119>", line 1, in <module>
        estCeEgal(x)
      File "<pyshell#9>", line 2, in estCeEgal
        return eval(str(a))
      File "<string>", line 1, in <module>
    NameError: name 'azerty' is not defined
    >>> W(y)
    "'azerty'"
    >>> estCeEgal(y)
    'azerty'
    >>> W(b)
    '3'
    >>> estCeEgal(b)
    3
    (En revanche pour a=3, tout se passe bien, même remarque a=[0,1], ou a=(0,1) , a=2.8 etc...)



    (*)Vous ne semblez pas "catégorique", y-aurait-il des cas où W et egal peuvent se comporter différemment?

    merci^^

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par MatheuxNoviceEnProg Voir le message
    (j'espère que j'ai pas l'air d'un taré, avec ce genre de préoccupations^^, je dirai plus tard pourquoi, dans la pratique je me suis posé cette question, c'est en rapport avec setqui apparemment n'accepte pas tous les types, contrairement aux listes : comme on le voit ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    set([[0,1],1])
    Traceback (most recent call last):
      File "<pyshell#45>", line 1, in <module>
        set([[0,1],1])
    TypeError: unhashable type: 'list'
    >>>
    )
    Mouais... Soit l'outil (set) n'est pas assez bon, soit vous n'utilisez pas le bon outil pour résoudre votre problème.
    Il serait préférable de décrire le problème que vous essayez de résoudre avant d'essayer de faire fonctionner une solution inadaptée.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  9. #9
    Membre à l'essai
    Homme Profil pro
    master2 math
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : master2 math

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par wiztricks Voir le message



    Mouais... Soit l'outil (set) n'est pas assez bon, soit vous n'utilisez pas le bon outil pour résoudre votre problème.
    Il serait préférable de décrire le problème que vous essayez de résoudre avant d'essayer de faire fonctionner une solution inadaptée.

    - W

    C'est ce que j'ai tout de suite fait lorsque j'ai constaté cette "lacune" de (set), mais je me suis dit, que ce serait chouette de recuperer gratis, toutes les opérations ensemblistes qui sont déjà dans (set), comme l'intersection, la réunion etc...

    ici http://www.developpez.net/forums/d15...-mathematique/

    j'ai fabriqué la fonction (ens) qui fait exactement ce que fait set mais pour les listes, tyrtamos a donné dans une réponse la façon d'obtenir la différence, et maintenant je vais faire deux choses pour m'entraîner : retrouver le reste des opérations ensembliste avec (ens) et tenter d'utiliser (set) pour vérifier que j'aurais pu me passer de de le faire (lol), je ne suis pas encore sur que le deuxième projet va fonctionner, en fait... mais grâce à votre message d'avant sur la fonction "repr" je pourrais surement arriver à quelque chose de pas loin du compte^^

    merci pour vos messages^^

  10. #10
    Membre à l'essai
    Homme Profil pro
    master2 math
    Inscrit en
    Mars 2016
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : master2 math

    Informations forums :
    Inscription : Mars 2016
    Messages : 19
    Points : 11
    Points
    11
    Par défaut
    Voici la fonction qui prolonge (set) à tous les types! elle retourne une "liste sans répétition" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    >>> def Im(Liste,f):
     
    	return [f(x) for x in Liste]
     
    >>> def liset(L):
    	return Im(list(set(Im(L,repr))),eval)
     
    >>> TEST=[0,0,1,[0,1],[0,1],"e","e","0","0"]
    >>> liset(TEST)
    [1, 'e', [0, 1], '0', 0]
    ça fait presque la même chose que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    def ens(a):
    	y=[]
    	for i in a:
    		if (i in y)==False:
    			y.append(i)
    	return y
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ens(TEST)
    [0, 1, [0, 1], 'e', '0']
    (seul l'ordre change)




    ^^ youpi

Discussions similaires

  1. [ALGO] Explose STR
    Par Arrown dans le forum Delphi
    Réponses: 18
    Dernier message: 17/05/2006, 10h06
  2. [SQL server] Décimal arrondi avec STR
    Par Cyrilange dans le forum Langage SQL
    Réponses: 3
    Dernier message: 06/08/2005, 19h13
  3. Conversion de type réciproque.
    Par Moucoulin dans le forum C++
    Réponses: 16
    Dernier message: 24/06/2005, 16h34
  4. Comparaison de 2 str
    Par twizell dans le forum C
    Réponses: 12
    Dernier message: 03/09/2003, 16h11
  5. [Dev-Pascal] Le compilateur renseigne la fonction Str comme illégale
    Par goto dans le forum Autres IDE
    Réponses: 3
    Dernier message: 16/08/2003, 16h22

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