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 :

fonction inverse de functools.reduce


Sujet :

Python

  1. #1
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut fonction inverse de functools.reduce
    Bonjour

    Je débute en Python. J'ai écrit cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ## [1,1,0,1] => 13 
    def compute(Bits):
        return functools.reduce(lambda x, y: x*2+y, Bits,0)
    Qui comme son nom ne l'indique pas vraiment, prend une liste composée de 0/1 pour calculer l'entier correspondant.
    J'ai écrit la fonction inverse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ## 13 => [1,1,0,1]
    def explode(Val):
        q,r = divmod(Val, 2)
        if q == 0 :
            return [r]
        return explode(q)+[r]
    qui prend un entier et l'écrit comme une liste de 0/1.
    Je me demandais s'il n'existe pas une fonction toute faite qui ferait le boulot ?

    Merci
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  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.
    Ca se fait tout simplement avec bin et int :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> bin(13)
    '0b1101'
    >>> int("1101", base=2)
    13
    C'est présenté dans la FAQ.

  3. #3
    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 Trap D Voir le message
    Je me demandais s'il n'existe pas une fonction toute faite qui ferait le boulot ?
    Si le but est de convertir des entiers dans leurs représentations décimales et binaires:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> a = 13
    >>> bin(a)
    '0b1101'
    >>> int('1101', base=2)
    13
    >>>
    "reduce" est une opération qui vient d'un contexte bien plus compliquée.
    Et telle que définie, son inverse n'existe pas.

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

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> int("1101", 2)
    13
    >>> bin(13)[2:]
    '1101'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> "{0:b}".format(13)
    '1101'
    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)

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Merci beaucoup pour ces réponses, mais j'ai besoin d'une liste (ou d'un tableau) de valeurs 1/0, qui pourront être interprétées en vrai/faux.
    Je pense avoir trouvé mon bonheur avec les fonctions de EDA (voir Python EDA Documentation) que j'aurais besoin de toute façon d'utiliser
    >>> A = uint2exprs(5,4)
    >>> A
    farray([1, 0, 1, 0])
    >>> A.to_uint()
    5
    Je mets la discussion en résolu
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Avec ce qu'on t'as donné il est pas bien difficile de créer une liste à partir d'une chaîne de caractères.

    Pour faire l'inverse, c'est à dire liste à chaîne de caractères, on utilise join

    J'ai pas bien compris l'intérêt de la liste, car une chaîne est un objet tout autant itératif, et à moins que tu veuilles modifier un élément de ta liste, je conseillerais de rester avec une chaîne de caractères.

    Peut-être si tu nous en disais plus sur ton problème, on pourrait te guider dans un sens conceptuel et non syntaxique.
    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)

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    En fait mon but est d'adapter un code Prolog en Python. En Prolog on ne manipule que des listes, donc je me tourne vers les listes.

    Le code résout des Sudoku en utilisant des contraintes sur les valeurs logiques. Le solveur utilisé clpb ne connait que 0 et 1, donc si je veux que le nombre A soit différent du nombre B, il faut que un des bits de A soit différent du bit correspondant de B. Voilà pourquoi j'ai besoin de transformer mes nombres en listes (ou en tableaux si c'est plus facile à manipuler).
    Mon espoir est que je puisse adapter ma méthode Prolog à Python.

    Une première difficulté : en Prolog on peut utiliser des listes dont les éléments n'ont pas de valeurs définies, on dit "je veux une liste de longueur 4", on écrit length(L, 4) et Prolog me fournit une variable L = [_, _, _, _], les _ signifient que les 4 éléments ne sont pas unifiés (n'ont pas de valeur définie). En Prolog, une fois qu'une variable est unifiée, elle ne change plus de valeur, est-ce qu'on peut faire la même chose en Python ?

    Merci de vos réponses.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Je ne connais pas prolog, mais je m'étais déjà renseigné, et ce n'est pas la même philosophie que python. Je pense qu'il est difficile, de penser prolog en faisant du python.

    Le solveur utilisé clpb ne connait que 0 et 1, donc si je veux que le nombre A soit différent du nombre B, il faut que un des bits de A soit différent du bit correspondant de B.
    La question est pourquoi transformer les nombres en bits et les comparer et pas seulement comparer des nombres entre eux?

    en Prolog on peut utiliser des listes dont les éléments n'ont pas de valeurs définies, on dit "je veux une liste de longueur 4", on écrit length(L, 4) et Prolog me fournit une variable L = [_, _, _, _], les _ signifient que les 4 éléments ne sont pas unifiés (n'ont pas de valeur définie).
    En python on peut créer une liste de n éléments, mais elle peut être modifiable, seulement on ne voit pas l'intérêt de modifier cette taille si tu contrôles l'index maximum correspondant à la taille de cette liste.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L = [None for _ in range(4)]
    Ensuite tu peux insérer un élément dans cette liste sans problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    L[0] = 5 # insère la valeur 5 dans la 1ère colonne (indice 0) de la liste L
    En Prolog, une fois qu'une variable est unifiée, elle ne change plus de valeur, est-ce qu'on peut faire la même chose en Python ?
    Donc non, comme dis précédemment, mais on vérifie que la valeur est None pour insérer ou non une valeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    element = L[0]
    if not element: # element == None
        L[0] = valeur
    On peut en créer une fonction pour rendre cela plus concis.

    J'espère t'avoir aidé, mais j'insiste sur le fait que tu devrais éviter les mêmes pensées pour chaque langage utilisé, car tu auras plus ou moins de difficulté à l'adapter.
    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)

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Merci pour tes éclaircissements.
    Je suis tout à fait d'accord, on ne pense pas pareil en Prolog et en Python, et ça m'intéresse aussi de découvrir un langage nouveau. Je vais donc réfléchir à l'adaptation du "concept" à Python. PYEDA à l'air très bien pour ça.
    La question est pourquoi transformer les nombres en bits et les comparer et pas seulement comparer des nombres entre eux?
    J'avais répondu à ta question avant que tu ne la poses, le solveur ne connait que vrai/faux (ou 1/0) Si je lui dis que j'ai deux variables différentes A et B, il me donnera deux solutions A = 0, B = 1 ou A = 1 et B = 0. Si je lui dit A \= 3 (\= veut dire littéralement non egal) il me dira que 3 n'est pas une valeur correcte.

    J'aurais sans doute encore des questions à poser.

    a+
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

Discussions similaires

  1. [C#] fonction inverse de Color.ToString().
    Par OpenGG dans le forum C#
    Réponses: 8
    Dernier message: 08/11/2006, 10h15
  2. fonctions inverse en c
    Par deboraya dans le forum C
    Réponses: 8
    Dernier message: 18/10/2006, 14h21
  3. Fonction inverse de ASCII
    Par noirot dans le forum Oracle
    Réponses: 1
    Dernier message: 15/06/2006, 15h30
  4. Fonction inverse de InttoHex
    Par marsupilami34 dans le forum Langage
    Réponses: 11
    Dernier message: 06/07/2005, 15h04
  5. [VB6]fonction inverse de Hex (nombres hexadécimaux)
    Par Guigui_ dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 08/10/2002, 19h31

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