Как разделить определенные символы, но не другие?

#python

#python

Вопрос:

Я хочу ввести строку элементов и составить один список с атомами и количеством этого атома. ["H3", "He4"]

Эти разделы работают, однако мне также нужно составить список только элементов. Это будет выглядеть примерно так ["H", "He"]

Однако, когда я пытаюсь разделить его на отдельные атомы, получается так. ["H", "H", "He"]

Вот мой текущий код для функции:

 def molar_mass():
    nums = "0123456789"
    print("Please use the format H3 He4")
    elements = input("Please leaves spaces between elements and their multipliers: ")
    element_list = elements.split()
    print(element_list)
    elements_only_list = []
    for element_pair in element_list:
        for char in element_pair:
            if char not in nums:
                elements_only_list.append(char)
        test = element_pair.split()
        print(test)
    print(elements_only_list)
  

Я знаю, что есть библиотека для чего-то подобного, однако я не хочу ее использовать.

Комментарии:

1. Если есть библиотека, почему бы вам не прочитать реализацию в библиотеке и не попробовать реализовать свою версию?

2. Я думаю, вам нужно будет создать полный список всех химических элементов и разделить их, начиная с самых длинных элементов (в противном случае скрипт будет думать, что у вас есть H для водорода, но вместо этого у вас есть He для гелия, например. Если вы начинаете с Helium, у вас не может быть проблемы).

3. Загляните в библиотеку регулярных re выражений для извлечения текстовых строк.

4. Я использую это как опыт для обучения, и я очень новичок.

5. В чем ваша проблема? Вы хотите elements_only_list , чтобы список включал только уникальные элементы? Если это проблема, попробуйте использовать set для elements_only_list Также в чем смысл этой строки? test = element_pair.split()

Ответ №1:

Ваша проблема здесь в том, что вы добавляете каждый нечисловой символ в elements_only_list качестве нового элемента этого списка. Вместо этого вы хотите получить часть element_pair , содержащую нечисловые символы, и добавить эту строку в список. Простой способ сделать это — использовать rstrip метод для удаления числовых символов из конца строки.

 for element_pair in element_list:
  element_only = element_pair.rstrip(nums)
  elements_only_list.append(element_only)
  

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

К вашему сведению, вам действительно не нужна ваша nums переменная. string Модуль содержит константы для различных стандартных групп символов. В этом случае вы могли бы импортировать string.digits .

Комментарии:

1. Хотя это действительно хорошее предложение, я думаю, что числа могут появляться в любом месте химической формулы, такой как H2SO4

2. @Pitto это правда, но на основе предоставленного кода программа будет ожидать, что это будет вводиться с пробелами между элементами: H2 S O4.

Ответ №2:

Насколько я понимаю, у вас будет пользовательский ввод, такой как H3 He4, и ожидается, что результат будет [‘H’,’He’] , соответственно я изменил вашу функцию:

 def molar_mass():


    print("Please use the format H3 He4")
    elements = input("Please leaves spaces between elements and their multipliers: ")
    element_list = elements.split() # splits text to a list
    print(element_list)


    results = []
    for elem in element_list: # loops over elements list
    
        #seperate digits from characters in a list and replace digits with ''
        el1 = list(map(lambda x: x if  not x.isdigit() else '' , elem))
        el2 = ''.join(el1) 
        results.append(el2)
return results

molar_mass()
  

используя эту функцию, с вводом, как показано ниже:

 H3 He4
  

вывод будет:

 ['H','He']