2013-03-12 52 views
0

我有一個名爲「name_score_smiles.csv」文件,該文件是這樣的:2個鍵排序,並結合雙方

('VA00001', '64.11', '33.12', 'Cl.O=C1Nc2ccc(N)cc2C1') 
('VA00002', '70.61', '54', 'CNCCC(=O)c1ccccc1') 
('VA00003', '53.15', '57.76', 'O=c1[nH]c2cnccc2n1c1ccccc1') 
('VA00004', '72.08', '41.82', 'CN1CCC(CC1)Nc1ccc(F)c(Cl)c1') 
('VA00005', '67.11', '57.17', 'CCN1CCC(CC1)Nc1ccc(Cl)cc1') 
('VA00006', '66.29', '48.66', 'O=C1Nc2cc3OCCOc3cc2C(C1)c1ccccc1') 
('VA00007', '70.59', '40.31', 'C=CCC1(CCCCC1)NCCc1ccccc1') 
('VA00008', '62.87', '43.29', 'Clc1cccc(CN2CCN(CC2)Cc2c[nH]c3ccccc23)c1') 
('VA00009', '70.53', '27.3', 'Clc1cccc(CNCCc2c[nH]c3ccccc23)c1') 
('VA00010', '67.15', '51.88', 'O=C(Nc1ccccc1)N1CCCCC1c1cccnc1') 
... 

我在讀它作爲一個列表的列表,我知道如何將這個文件排序根據第二或第三欄。我的腳本到目前爲止是這樣的:

with open('name_score_smiles.csv') as fin: 
     lst = list(csv.reader(fin)) 

lst_20 = sorted(lst, key=lambda x:float(x[1]), reverse=True) 

我想做到這一點: 我想根據第二列進行排序名單和保存的排名。然後根據第三列對其進行排序並保存排名。所以最終我可以根據兩列中的排名對整個文件進行排序。這是否明確我的意思?

感謝大家的回答!

回答

2

通常你會使用一個tuple或一些其它序列作爲像這樣的東西排序關鍵字:

sorted(lst, key=lambda x: (float(x[1]),float(x[2])), reverse=True) 

在排序結束後,你有你的項目由decending列2排序。在列2中的值相等的情況下,將使用列3的比較。

+0

不幸的是,這並不適用於我。列3中的值(幾乎)總是低於列2中的值,它們不能直接相互比較。我真的必須分別根據第二和第三列進行排序。 – Julian 2013-03-12 15:44:55