2013-09-26 3 views
0

Я хотел бы улучшить свой код в Python. Я ищу логическую помощь здесь, чтобы получить тот же результат с меньшим количеством кода.Python: лучший логический способ решения «Изучение Atom»

Моя процедура получает строку атомов через параметр и «учит» их, возвращая список атомов, которые он узнал.

Я хотел бы знать, есть ли способ оптимизировать мой код.

def mol_term(molecule): 
    upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 
    list_of_atoms = [] 

    for i in range(len(molecule) - 1): #goes all string long 
     if molecule[i] in upper: 
      if not molecule[i+1] in upper: 
       temp = molecule[i] + molecule[i+1] #if atom has two letters 
       i = i + 1 
      else: 
       temp = molecule[i] #if not 

      if not temp in list_of_atoms: 
        list_of_atoms.append(temp) #if atom is not in the list appends to it 
    if molecule[-1] in upper: 
     list_of_atoms.append(molecule[-1]) #checks last letter 


    return print(list_of_atoms) 

спасибо.

+0

Что такое атом? Вы имели в виду элемент, такой как Au, H, He? – justhalf

ответ

1

Вы ищете выражение регулярного выражения, которое захватывает символ капитала, за которым следует, возможно, нижний символ.

list(set(re.findall('[A-Z][a-z]?', 'CuBDa'))) 

Но вы можете быть видом номера, т.е. CO2, это будет делать, что

re.findall('[A-Z][a-z]?[0-9]*', 'C4H10FO2P') 

Если вы просто хотите, чтобы игнорировать цифры, то первое выражение будет работать

+1

OP _is_ ищет индивидуальный элемент, я думаю. Таким образом, вы можете просто игнорировать числа. – justhalf

+0

И OP не хочет дубликатов, вы можете удалить дубликаты, используя 'list (set (...))', чтобы получить окончательный список. – justhalf

0

Это должно сделать хитрость

import re 
molecule = 'CH3COOH' 
print set(re.findall('[A-Z][a-z]?',molecule)) 

, который будет печатать:

set(['H', 'C', 'O']) 
0

Я предлагаю вам проверить документацию Python PLY и посмотреть пример Andrew Dalke для примера синтаксического анализа с молекулами. (http://www.dalkescientific.com/writings/NBN/parsing_with_ply.html)

Вы можете определить маркеры с атомным символом и времени этот атом/символ появляется в молекуле, например, для молекулы, как СН3СООН (уксусная кислота)

import lex 

tokens = (
    "SYMBOL", 
    "COUNT" 
     ) 

t_SYMBOL = (
    r"C[laroudsemf]?|Os?|N[eaibdpos]?|S[icernbmg]?|P[drmtboau]?|" 
    r"H[eofgas]?|A[lrsgutcm]|B[eraik]?|Dy|E[urs]|F[erm]?|G[aed]|" 
    r"I[nr]?|Kr?|L[iaur]|M[gnodt]|R[buhenaf]|T[icebmalh]|" 
    r"U|V|W|Xe|Yb?|Z[nr]" 
     ) 

def t_COUNT(t): 
    r"\d+" 
    t.value = int(t.value) 
    return t 



lex.lex() 

lex.input("CH3COOH") 
for tok in iter(lex.token, None): 
    print repr(tok.type), repr(tok.value) 

При запуске кода Я получаю следующее

'SYMBOL' 'C' 'СИМВОЛ' 'H' 'COUNT' 3 'СИМВОЛ' 'C' 'СИМВОЛ' 'о' 'СИМВОЛ' 'O' «SYMBOL '' H '

Более подробная информация здесь http://www.dabeaz.com/ply/

Смежные вопросы