Как игнорировать указанный c символ в строке, а затем использовать его? - PullRequest
1 голос
/ 06 марта 2020

Ранее я задавал вопрос о том, как разделить символы в строке по заглавным буквам или пробелам. Это было немедленно ответил. Работая над тем же фрагментом кода, и теперь мне было интересно, можно ли прочитать входные данные и игнорировать целые числа, а затем использовать их.

Например, если строка H2O, умножьте значение H дважды, а затем добавьте значение O.

Как прочитать два символа из входной строки?

^^ Это ссылка на мой предыдущий вопрос, который я задавал по тому же коду, если это полезно.

import re

atomMass_Table = {'H': 1.00797, 'He': 4.00260, 'B': 10.81,'C': 12.011, 'N': 14.067, 'O': 15.9994,'F': 
18.998403,'P': 30.97376, 'S': 32.06, 'K':39.0983, ' ': 0, None: 0}

TotalMass=0
elements=[ ]

mol=input("Enter a molecule:")

elements = re.findall('[A-Z][^A-Z]*', mol)
for a in elements:
    if a == int:
       element=None
       atomicMass=atomMass_Table.get(a)
       TotalMass=TotalMass+atomicMass
print (TotalMass)

Надеюсь, я не слишком запутан:)

Ответы [ 4 ]

1 голос
/ 06 марта 2020

Используйте isalpha(), чтобы проверить, содержит ли элемент только буквы. Если нет, вы можете использовать нарезку строк, чтобы получить значение первого символа из словаря, и умножить на второй символ.

atomMass_Table = {'H': 1.00797, 'He': 4.00260, 'B': 10.81,'C': 12.011, 'N': 14.067, 'O': 15.9994,'F': 
18.998403,'P': 30.97376, 'S': 32.06, 'K':39.0983, ' ': 0, None: 0}

TotalMass = 0
mol = input("Enter a molecule: ")
elements = re.findall('[A-Z][^A-Z]*', mol)

for a in elements:
    if a.isalpha():
        TotalMass += atomMass_Table.get(a)
    else:
        TotalMass += atomMass_Table.get(a[0]) * int(a[1])
print(TotalMass)

Пример:

Enter a molecule: H2O
18.01534
>>> 
1 голос
/ 06 марта 2020

Есть два решения для вас. Я не понимаю решения Томаса, но решение Эля c приемлемо. Тем не менее, это не может работать, если у вас есть что-то вроде "C12H22O11". Я даю решение, которое может это исправить, посмотрите.

atomMass_Table = {'H': 1.00797, 'He': 4.00260, 'B': 10.81,'C': 12.011, 'N': 14.067, 

'O': 15.9994,'F': 18.998403,'P': 30.97376, 'S': 32.06, 'K':39.0983, ' ': 0, None: 0, 'd': 0}

TotalMass=0
elements=[ ]

mol=input("Enter a molecule:")
if not mol[-1].isdigit():
    mol += '1'
mol += 'd'
number = []

for a in mol:

    if a.isdigit():
       number.append(a)
    else:
        if not number:
            value = atomMass_Table.get(a)

        else:
            TotalMass += value * int(''.join(number))
            value = atomMass_Table.get(a)
            number = []
print (TotalMass)

Решение для H2O - 18.01534, а C12H22O11 - 342.30074. Надеюсь, что это поможет!

1 голос
/ 06 марта 2020

Как насчет этого?

import re

atom_masses = {'H': 1.00797, 'He': 4.00260, 'B': 10.81, 'C': 12.011, 'N': 14.067, 'O': 15.9994, 'F':
    18.998403, 'P': 30.97376, 'S': 32.06, 'K': 39.0983, ' ': 0, None: 0}

total_mass = 0
elements = []

mol = input("Enter a molecule:")

parts = re.findall('([A-Z][a-z]?)(\d)*', mol)
print(parts)
for element, count in parts:
    if count == '':
        count = 0
    atomic_mass = atom_masses.get(element)
    total_mass = total_mass + atomic_mass * float(count)
print (total_mass)

Я изменил регулярное выражение, чтобы разделить строку на отдельные атомы и их количество. Это должна быть заглавная буква, за которой следуют необязательная маленькая буква и необязательный номер.

Кроме того, я изменил имя переменной, потому что они должны быть строчными.

0 голосов
/ 06 марта 2020

Я немного расширил ваш запрос и добавил класс для каждой молекулы.

Класс содержит три атрибута:

  • raw_element
  • структура молекулы
  • масса молекулы

класс можно расширить с помощью рисунка молекулы или других элементов.

Класс:

class molecule:
    def __init__(self, raw_element, atom_mass_table):
        self.amt = atom_mass_table
        self.raw_element = raw_element
        self.molecule_structur = self.get_struc()
        self.molecule_mass = self.cal_mass()

    def get_struc(self):
        return [self._split_nodes(e) for e in self._split_in_nodes()]

    def cal_mass(self):
        sum = 0
        for i in self.molecule_structur:
            sum += self.amt[i[0]] * i[1]
        return sum


    def _split_nodes(self, node):
        s = ""
        n = ""
        for l in node:
            if l.isalpha():
                s += l
            elif l.isdigit():
                n += l
        if n is None:
            n = 1
        return (s, int(n))

    def _split_in_nodes(self):
        new_el = [e.isupper() for e in self.raw_element]
        el_str = []
        pos = 0
        for _ in range(sum(new_el)):
            if True in new_el[pos+1:]:
                end = pos + new_el[pos+1:].index(True)+1
            else:
                end = len(new_el)
            el_str.append(self.raw_element[pos:end])
            pos = end
        return el_str

Классу нужно только:

  • описание необработанного элемента - C12H22O11
  • предоставленная вами atom_mass_table - я не включил его в класс, чтобы потом было проще его расширить.

Итак, чтобы проверить код:

if __name__ == "__main__":

    element = input("Please enter your Molecule: ")

    molecule = Molecule(element, atom_mass_table)
    print(molecule.molecule_structur)
    print(molecule.molecule_mass)

Ввод:

Please enter you Molecule:  C32H128O64

Выход:

[('C', 32), ('H', 128), ('O', 64)]
1537.33376

Надеюсь, это поможет, и когда вы улучшите это приложение, вы можете пригласить меня к себе на GitHub Project.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...