Saya sedang mengerjakan konversi formular kimia ke proporsi elemen dengan menggunakan python.

Misalnya: Saya memiliki daftar ["Ti5Cu3", "TiCu2", "Ti2Cu3"] sebagai daftar input, dan ingin mengonversinya menjadi [5/(5+3), 1/(1+2), 2/(2+3)].

Bagaimana saya bisa mendapatkan nomor di belakang tanda elemen? Saya pikir perpustakaan re mungkin berguna? Dan bagaimana menggunakannya untuk menyelesaikan masalah saya?

Solusi saya sekarang adalah:

def formula2por(s):                             
    if s == "Ti":       
        return 1
    elseif s == "Cu":
        return 0
    else:                                       
        t = re.match(r'Ti(.*)Cu(.*)', s).groups()
        # pdb.set_trace()                       
        if t[0] is not '':
            x = int(t[0])
        else:
            x = 1       
        if t[1] is not '':
            y = int(t[1])                                                                        
        else:                                   
            y = 1                               
        return round(x/(x+y), 4)  

Namun, saya pikir ini lembek dan bukan cara Pythonic untuk pertanyaan ini.

Terima kasih.

0
Jason Yu 14 Agustus 2017, 04:50

2 jawaban

Jawaban Terbaik

Anda dapat menggunakan Ti(\d*)Cu(\d*) untuk menangkap angka dan meneruskan objek yang cocok ke fungsi pengganti; di mana digit dapat diakses sebagai grup yang diambil pertama dan kedua masing-masing:

lst = ["Ti5Cu3", "TiCu2", "Ti2Cu3"]
​
def div_sub(match):
    x, y = match.group(1), match.group(2)
    x = 1 if x == '' else int(x)
    y = 1 if y == '' else int(y)
    return str(x/(x+y))
​
import re
[float(re.sub(r"Ti(\d*)Cu(\d*)", div_sub, s)) for s in lst]
# [0.625, 0.3333333333333333, 0.4]
3
Psidom 14 Agustus 2017, 02:06

Anda dapat dengan mudah menangani ini jika kami berasumsi bahwa Anda tidak memiliki satu pun dari ketiga kode huruf tersebut. Kemudian,

def calculate(match):
    i = 1, tmp = []
    while match.group(i) != '':
         if match.group(i+1) == '':
             tmp.append(1.0)
         else:
             tmp.append(float(match.group(i+1)))
         i += 2
    if i == 1:
        return 0
    else:
        return tmp[0]/sum(tmp)


import re
required_list = []
pattern = re.compile("^([A-Z][a-z]?)(\d*\.?\d*)([A-Z][a-z]?)(\d*\.?\d*)")
for compound in lst:
    required_list.append(calculate(pattern.match(compound)))

Seperti yang Anda lihat, kode ini dapat dengan mudah disesuaikan dengan senyawa multi elemen seperti kalium permanganat dan menangani indeks titik mengambang.

0
N M 14 Agustus 2017, 02:51