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

Calcul scientifique Python Discussion :

reconnaitre le nombre de chaque atome d'une molécule


Sujet :

Calcul scientifique Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut reconnaitre le nombre de chaque atome d'une molécule
    Bonjour!
    Alors je vous explique , nous avons un projet pyhton à réaliser dans ma prépa , avec mon groupe nous avons décidé de faire un programme pour équilibrer des réactions chimiques assez simples .
    Pour cela nous aimerions que dans un premier temp le programme puisse reconnaitre le nombre de chaque atome d'une molécule donnée , par exemple CH4 -> 1carbone et 4 hydrogènes .
    Nous avons trouvé des moyens pour que le programme puisse reconnaitre chaque lettre le problème c'est que sur mon exemple avec le CH4 pour que notre programme reconnaisse 4 hydrogènes il faudrait écrire CHHHH.
    Donc si quelqu'un pourrait nous orienter sur des élèments de réponses ce serait génial !
    Merci d'avance

  2. #2
    Modérateur

    Avatar de Vincent PETIT
    Homme Profil pro
    Consultant en Systèmes Embarqués
    Inscrit en
    Avril 2002
    Messages
    3 190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Consultant en Systèmes Embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Avril 2002
    Messages : 3 190
    Points : 11 573
    Points
    11 573
    Par défaut
    Salut,
    Il faut modifier un peu ton algorithme pour qu'il reconnaisse aussi les chiffres.

    Exemple :
    CH4 = C1H4
    CO = C1O1
    H2O = H2O1

    Moi je verrai bien un truc du genre, chercher après une lettre (l'atome), derrière il y a trois cas possibles, premier cas on tombe sur un lettre ce que signifie qu'il n'y a qu'un atome, le deuxième on tombe sur un chiffre alors pas de problème car celui-ci est le nombre d'atomes et la troisième c'est qu'il n'y ait rien derrière au quel cas on est à la fin de la molécule.
    La science ne nous apprend rien : c'est l'expérience qui nous apprend quelque chose.
    Richard Feynman

  3. #3
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    C'est intéressant ça, faut écrire un parseur.

    Un exemple basique, sans gestion d'erreur:
    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
     
    # -*- coding: utf-8 -*-
     
    elements = {"H": "hydrogène",
                "LI": "Lithium",
                "NA": "Sodium",
                "C": "Carbone",
                "O": "Oxygène"}
     
    def parse(mol):
        mol = list(mol)
        def define_number():
            if mol:
                l = mol[0]
                if l.isdigit():
                    l = mol.pop(0)
                    if mol and mol[0].isdigit():
                        return l + mol.pop(0)
                    return l
            return "1"
     
        atoms = {}
        while(mol):
            letter = mol.pop(0)
            if letter.upper() in elements:
                n = define_number()
                atoms[elements[letter.upper()]] = n
     
            else:
                at = letter + mol.pop(0)
                if at.upper() in elements:
                    n = define_number()
                    atoms[elements[at.upper()]] = n
     
                else:
                    pass # Erreur a gerer !
     
        return atoms
     
    for e in ("HO2", "CO2", "H3LI2CO5"):
        print(parse(e))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vincent@djoliba:~/Bureau$ python3 mendeleyev.py 
    {'Oxygène': '2', 'hydrogène': '1'}
    {'Oxygène': '2', 'Carbone': '1'}
    {'Oxygène': '5', 'Carbone': '1', 'hydrogène': '3', 'Lithium': '2'}


    (Ne cherchez pas "H3LI2CO5", je viens de découvrir cette molécule)

  4. #4
    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,

    pour le coup il y a peut-être plus simple encore, acté que les éléments ont une certaine nomenclature; une majuscule suivi d'une ou deux minuscule(s) éventuelle(s) (donc ce serait plutôt H3Li2CO5 en fait )
    c'est assez facile de dissocier chaque nom d'élément de sa quantité avec une regexp bien placée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    >>> re.findall('([A-Z][a-z]{,2})(\d*)', s)
    [('H', '3'), ('Li', '2'), ('C', ''), ('O', '5')]
    du coup le nombre total d'atomes ça reviendrait à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    s = 'H3Li2CO5'
    >>> sum([1 if nombre is '' else int(nombre) for element,nombre in re.findall('([A-Z][a-z]{,2})(\d*)', s)])
    11
    >>> print '\n'.join(['{} atomes {}'.format(1 if nombre is '' else int(nombre), element) for element,nombre in re.findall('([A-Z][a-z]{,2})(\d*)', s)])
    3 atomes H
    2 atomes Li
    1 atomes C
    5 atomes O
    ps: oui je vais passer définitivement à py3 un jour, promis, honte sur moi en attendant j'avoue

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Bonjour !
    Tout d'abord merci beaucoup pour vos réponses , elles nous ont permis d'avancer.
    VinsS nous avons commencé à travailler à partir de votre programme, seulement avant de pouvoir rajouter ce dont nous avons besoin et de le modifier pour pouvoir arriver au therme de notre projet, nous voulons nous assurer de bien comprendre ce programme. Sachant que nous sommes encore novices et qu'ils nous manque plusieurs bases , nous avons certaines questions :
    Donc par exemple , nous ne comprenons pas le "mol" (sa place dans le programme ), "define_number()" et la commande pop (nous avons chercher mais nous ne comprenons pas ce que signifie retourner un élément )
    Merci encore sinon
    Cordialement,

  6. #6
    Membre chevronné
    Homme Profil pro
    Enseignant
    Inscrit en
    Juin 2013
    Messages
    1 608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 608
    Points : 2 072
    Points
    2 072
    Par défaut
    Vu les questions que vous posez, votre prof va savoir rapidement que vous n'avez pas produit le code.
    Vous feriez mieux de reprendre les idées de VinsS et de faire votre propre programme.
    Pas d'aide par mp.

  7. #7
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    En fait c'est dans l'optique de nos enseignants justement , ils savent qu'on est débutant et qu'on a peu d'heure , ils veulent donc qu'on trouve des solutions aux problèmes qu'ils nous ont posé en essayant de comprendre ce que l'on fait .
    C'est pour cela que l'on s'intéresse au fonctionnement du programme , pour comprendre mieux python

  8. #8
    Expert éminent

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 300
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 300
    Points : 6 780
    Points
    6 780
    Par défaut
    Dans l'absolu, une solution avec regex est bien sur plus efficace mais pour un débutant les expressions régulières c'est de l'ésotérisme.

    Le code du parser est assez simple, la fonction reçoit un argument mol qui est la chaîne de texte de la molécule, celle-ci est d'abord convertie en liste de caractères.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >>> a = "H3LI2CO5"
    >>> a = list(a)
    >>> a
    ['H', '3', 'L', 'I', '2', 'C', 'O', '5']
    Ensuite on enlève chaque lettre de la liste pour les examiner avec la méthode pop
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    >>> a.pop(0)
    'H'
    >>> a
    ['3', 'L', 'I', '2', 'C', 'O', '5']
    Si la lettre est dans la liste des éléments connus, on vérifie si ce qui suit est un chiffre avec la méthode isdigit(), si ce n'est pas le cas un 1 est retourné, sinon le nombre lui-même.

    Lorsque la liste est vide la boucle while s'arrête.


    Deux remarques:

    Le code ne prend en compte que les éléments de une ou deux lettres, donc buggera avec les éléments Unp, Ung et Unh. À prévoir.

    Le code ne prévoit que des quantités d'au maximum 99 atomes d'un seul type dans la molécule.

    Ces deux choses étant laissées à titre d'exercice ...

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Merci !
    Merci beaucoup VinsS pour vos réponses, vous nous avez grandement aidés, et notre projet a bien avancé !
    Nous vous informerons des évolutions et de la finalisation du projet prochainement

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 26
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2017
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Équilibrage de la réaction
    Bonjour !
    A présent il nous reste deux problèmes à régler .
    Nous devons résoudre un système pour pouvoir équilibrer notre équation nous avons écris le programme suivant :
    Nom : IMG_0571.PNG
Affichages : 643
Taille : 160,7 Ko
    Le programme nous dit que la ligne 21 a un problème : nous possédons numpy donc nous nous demandons si cela vient du fait que l'on utilise des lettres mais on ne comprend pas car on leur a attribué une valeur juste avant.
    Ensuite nous essayerons de relier les caractères reconnus par l'autre programme au système.
    Si vous comprenez d'où vient le problème merci d'avance

  11. #11
    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 Lescroft Voir le message
    Le programme nous dit que la ligne 21 a un problème
    La moindre des choses serait de poster le message d'erreur ou mieux le traceback (plusieurs lignes) sorties par Python.

    Citation Envoyé par Lescroft Voir le message
    : nous possédons numpy donc nous nous demandons si cela vient du fait que l'on utilise des lettres mais on ne comprend pas car on leur a attribué une valeur juste avant.
    De toutes façons, vos variables étant des chaînes de caractères, pour trouver des zéros, çà ne peut pas le faire...

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

Discussions similaires

  1. Réponses: 15
    Dernier message: 21/07/2017, 14h57
  2. Réponses: 4
    Dernier message: 28/05/2010, 17h11
  3. Réponses: 2
    Dernier message: 28/04/2010, 11h25
  4. Réponses: 3
    Dernier message: 08/04/2009, 12h10
  5. stocker le nombre de fichier de chaque type dans une table de hach
    Par niklos0 dans le forum Programmation et administration système
    Réponses: 7
    Dernier message: 24/09/2008, 15h34

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