Подсчет количества элементов в молекулярном соединении с помощью Python (рекурсия, если возможно)?Python

Программы на Python
Ответить
Anonymous
 Подсчет количества элементов в молекулярном соединении с помощью Python (рекурсия, если возможно)?

Сообщение Anonymous »

Итак, я пытаюсь закодировать что-то, чтобы узнать количество элементов в любом данном соединении. Я даже не знаю, с чего начать: я пробовал что-то закодировать, но потом понял, что это работает только для простых соединений (или не работает вообще). Вот пример того, что я хочу:

Код: Выделить всё

>>> function_input : 'NaMg3Al6(BO3)3Si6O18(OH)4', 'O'

>>> function_return : 31
Я зашел так далеко в своем беспорядке с кодом (ОН НЕ РАБОТАЕТ, это просто иллюстрирует мой грубый мыслительный процесс):

Код: Выделить всё

def get_pos_from_count(string: str, letter: str):
count = string.count(letter)
lens = [-1]
for i in range(count):
lens += [string[lens[i] + 1:].index(letter) + lens[i] + 1]
return lens[1:]

def find_number(string, letter):
if string.count(letter) == 0: return 0
numbers = '1234567890'
try:
mul1 = int(string[0])
except ValueError:
mul1 = 0
mul2 = []
sub_ = 1
list_of_positions = get_pos_from_count(string, letter)
for i in list_of_positions:
try:
sub_ += int(string[i + 1]) if string[i + 1] in numbers else 0
except IndexError: pass
if string[i + 1:].count(')') > string[i + 1].count('('):
try:
mul2 += int(string[string[i + 1:].count(')') + 1])
except (IndexError, ValueError): pass
return mul1 * sub_ * mul2
Подход, который я пытался реализовать, заключался в следующем:
  • Определите количество вхождений указанного элемента в составное соединение.
  • Найдите каждый нижний индекс, умножив его на нижний индекс вне скобки, если указанный элемент находится в скобках.
  • Суммируйте все индексы, умножьте на количество составных элементов (первый символ в строке)
  • Верните указанное число пользователю
    />
Но потом я понял, что мой код будет либо очень длинным, либо потребует рекурсии, которую я не знаю, как здесь применить.
Если возможно, мне нужна полурабочая функция, но быстрый совет о том, как это сделать, тоже будет полезен!
И я не хочу использовать внешние библиотеки, если это возможно.
tl;dr: Этот вопрос для атомарность элементов без внешних библиотек (если возможно).
РЕДАКТИРОВАТЬ: Да, в вопросе, на который я ссылаюсь, есть подсказки о том, как это сделать, но когда я попытался заставить любой код работать только для одного элемента и установил его вес равным 1, я столкнулся с множеством проблем, которые не знаю, как решить.

Подробнее здесь: https://stackoverflow.com/questions/709 ... ecursion-i
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»