在(一)文中,在最後輸出結果時,只是將相對分子質量的值輸出,並未將對應的分子式輸出,琢磨了一天,將改進的程式碼貼出來,希望大家可以給出點優化建議!

import openpyxl
import re

def massMr(s):#定義計算相對分子質量的函式,
    
    list1 = ['O', 'N', 'C', 'H']
    dict1 = {'O':16, 'N':14, 'C':12, 'H':1}
    
    a = re.findall('\d+', s)
    
    sum = 0
    
    for i in range(4):
        
        
        sum += int(dict1[list1[i]]) * int(a[i])
        
#    print('相對分子質量為:%d'% sum)
        
    return sum

wb = openpyxl.load_workbook('Molecularformula-max-Mass.xlsx')
ws = wb.get_active_sheet()
#print(ws)
sheet = wb.get_sheet_by_name('Sheet1')#進入表單1

ws1 = wb.create_sheet(index = 1, title = 'Sheet2')#新建表單2

list1 = []

list3 = []

#print(sheet['A1'].value)
for i in range(1, int(sheet.max_row) + 1, 2):#對奇數行進行迭代
    for j in range(1,int(sheet.max_column) + 1):#對列進行迭代,
        if sheet.cell(row = i, column = j).value == None:#單元格為空,跳出迴圈
            break
        
        else:#單元格不為空,進行計算
            cellMass = massMr(str(sheet.cell(row = i, column = j).value))
            #dict1 = dict((cellMass, str(sheet.cell(row = i, column = j).value)))
            #print(dict1)
            list2 = list1.insert(0,[int(cellMass), str(sheet.cell(row = i, column = j).value)])
    cellMass_max = max(list1)#使用max函式取相對分子質量最大的值,注意list1中的元素為列表(由兩個元素構成)
    list4 = list3.append(cellMass_max)#將cellMass_max生成列表
    ws1.append(list3[0])#注意append時,引數需為列表,元祖等可迭代物件,此時需用list3[0],因為list3是由列表構成的列表
    wb.save('Molecularformula-max-Mass.xlsx')#儲存在原檔案中,
    list1 = []
    list3 = []
輸出結果為:
876 O24N24C12H12
1284 O35N35C18H18
1130 O28N32C18H18
1387 O33N40C23H23
1327 O31N39C22H21
1065 O24N31C19H19
1489 O36N42C25H25
786 O16N23C16H16
744 O16N20C16H16
770 O20N20C13H14
857 O13N27C21H19
986 O20N29C20H20
1860 O44N54C31H28
981 O23N29C16H15
849 O25N21C12H11
1040 O25N29C18H18

等。

應該注意的是,在倒數第四行:

ws1.append(list3[0])
中,應該append(list3[0])。首先append時,應為列表,元組等可迭代的物件;其次,list3本身是一個由列表元素(每個列表元素由兩個元素構成,一個是整型的cellMass,另一個是字串分子式)構成的列表,所以需要訪問list3[0]。如果是用append(list3)的話,則會報錯:cannot convert [876, 'O24N24C12H12'] to Excel。原因就是list3 = [[876, 'O24N24C12H12']]。