Calculateur de masse molaire

Fermé
Pirate91gb - Modifié le 3 juin 2021 à 11:30
 Pirate91gb - 8 juin 2021 à 17:12
Bonjour,
Je cherche à créer une fonction python permettant de calculer la masse molaire (masse d'une molécule selon un paquet) avec une base de données sous la forme d'un dictionnaire tel que :
base = {"H":1,"He":4,"Li":7,"Be":9,"B":11,"C":12,"N":14,"O":16,"F":19,"Ne":20,"Na":23,"Mg":24,"Al":27,"Si":28,"P":31,"S":32,"Cl":35,"Ar":40}

En effet, le problème vient du fait que l'utilisateur entre un string, qu'il le décompose caractères suivis de coefficients (integers). Ainsi, on peut voir que H et He commencent avec les mêmes caractères. Je voudrais donc que j'obtienne 18 g/mol quand j'utilise
calcul("H2O")
.

De plus, je voudrais transformer cette liste
liste = ["H","2","O"]
en
liste=["H",2,"O"]
, la différence est que 2 n'est plus du types str, mais int.
Dans l'attente de votre réponse,

3 réponses

M3NSONG3 Messages postés 615 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 4 novembre 2021 162
3 juin 2021 à 11:41
Salut !

Alors pour décomposer le string en list, tu peux utiliser simplement : list(str) :
>>> list("mon_string")
['m', 'o', 'n', '_', 's', 't', 'r', 'i', 'n', 'g']


Ensuite, pour transformer tes chiffres en int, tu peux utiliser :
>>> for i, x in enumerate(liste):
...     if x.isdigit():
...             liste[i] = int(x)


Ou la version condensée :
liste = [int(x) if x.isdigit() else x for x in liste]


Et j'ai pas compris exactement ce que tu veux avec les H, He... la manière la plus simple est de "couper" ta liste avant chaque majuscule.

Si j'ai mal répondu dis moi je garde le sujet dans mes suivis...

Bon courage !

--
Cordialement.
1
Oui c'est ce que je veux faire,
Pour calculer la masse molaire, il faut prendre la valeur de la molécule dans le dictionnaire base, le multiplier par le chiffre juste après :
Par exemple ; M(H2O) = M(H)*2 (car le 2 juste après est là pour dire qu'il y a 2 hydrogène) + M(O) = 2*1 + 16 = 18 g/mol
0
M3NSONG3 Messages postés 615 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 4 novembre 2021 162 > Pirate91gb
3 juin 2021 à 12:02
Ahah merci, mais t'inquiète pas je sais calculer une masse molaire :3
Je voulais juste savoir précisément où tu avais besoin d'aide !

Histoire de t'avancer un peu, en continuant sur mon idée qui est peut-être la plus simple... Du moins la plus simple à imaginer et qui me vient en tête, tu peux utiliser cette fonction pour découper les atomes :
def getMolecule(molecule):
    liste = list()
    index_copy = 0
    for index, lettre in enumerate(molecule):
        if not lettre.isdigit():
            if lettre.isupper():
                liste.append(molecule[index_copy:index])
                index_copy = index
    liste.append(molecule[index_copy:len(molecule)])

    molecule_triee = list()
    for atome in liste[1:]:
        molecule_triee.append("".join(atome))
    return molecule_triee


Exemple d'entrée : "CoCl3" --> ["Co", "Cl3"]
Si ta formule est correctement et que mes cours de chimie sont pas trop loin, le chiffre se trouve toujours après la lettre, il te suffit de vérifier si le dernier élément de chaque molécule est une chiffre, et si oui, le retirer puis t'en servir comme coefficient, sachant que ce qu'il te reste dans le string après, c'est la clef de ton dictionnaire...

Bon courage
0
Bonjour,
D'abord, merci de m'avoir répondu. Ta réponse claire m'a permis de commencer ma fonction.
0
M3NSONG3 Messages postés 615 Date d'inscription mardi 16 avril 2013 Statut Membre Dernière intervention 4 novembre 2021 162
5 juin 2021 à 23:35
Aucun problème, hésite pas si tu bloques encore, je passe régulièrement sur le forum !
0
Oui bonjour,
J'ai pu trouver la réponse. Mon professeur a dit que je réfléchissais de manière complexe. Alors j'ai fait ça :
base = {"H":1,"He":4,
        "Li":7,"Be":9,"B":11,"C":12,"N":14,"O":16,"F":19,"Ne":20,
        "Na":23,"Mg":24,"Al":27,"Si":28,"P":31,"S":32,"Cl":35,"Ar":40}

def dic_mol(molecule):
    mol = 0
    for i in molecule.keys():
        for j in base.keys():
            if i == j:
                mol += base[j]*molecule[i]
    return mol

Quand je fais
dic_mol({"H":2,"O":1})
j'obtiens bien 18 g/mol
Merci de ton aide
0