按特定列排序字符串

时间:2014-12-21 15:26:39

标签: python sorting

我需要对文本文件进行排序。该文件包含由新行'\n'分隔的行。 示例输入:

ATOM   1591  O5'   G A 958       5.497  -3.281   3.598  1.00 99.99           O  
ATOM   1592  C5'   G A 958       4.345  -3.184   2.781  1.00 99.99           C 
ATOM      1  P     C A 924     -12.106   6.485 -14.650  1.00 99.99           P  
ATOM      2  OP1   C A 924     -12.981   6.565 -15.850  1.00 99.99           O  
ATOM      3  OP2   C A 924     -10.829   7.256 -14.620  1.00 99.99           O 
ATOM    429 2H4    C A 947       1.295  -1.142  -0.764  1.00 99.99           H  
ATOM    430  P     G A 948      -2.886  -4.112   7.863  1.00 99.99           P   

我希望按第6列(958924等对其进行排序。)

ATOM      1  P     C A 924     -12.106   6.485 -14.650  1.00 99.99           P  
ATOM      2  OP1   C A 924     -12.981   6.565 -15.850  1.00 99.99           O  
ATOM      3  OP2   C A 924     -10.829   7.256 -14.620  1.00 99.99           O 
ATOM    429 2H4    C A 947       1.295  -1.142  -0.764  1.00 99.99           H  
ATOM    430  P     G A 948      -2.886  -4.112   7.863  1.00 99.99           P  
ATOM   1591  O5'   G A 958       5.497  -3.281   3.598  1.00 99.99           O  
ATOM   1592  C5'   G A 958       4.345  -3.184   2.781  1.00 99.99           C 

我试过这样做:

splitted = pdb_data.splitlines()
sorted(splitted, key = lambda residue: int(residue.split()[5]))
pdb_data = '\n'.join(splitted)
pdb_data +='\nTER\n'

但它没有排序。 : - /

1 个答案:

答案 0 :(得分:2)

您使用错误的方法进行排序;要对进行排序,请使用list.sort() method

splitted.sort(key = lambda residue: int(residue.split()[5]))

sorted() function会返回新列表,原始列表未排序,但您的代码会忽略返回值。

您还可以将sorted()的返回值分配回splitted,但这里的效率相当低。

你的排序本身很好用:

>>> splitted = '''\
... ATOM   1591  O5'   G A 958       5.497  -3.281   3.598  1.00 99.99           O  
... ATOM   1592  C5'   G A 958       4.345  -3.184   2.781  1.00 99.99           C 
... ATOM      1  P     C A 924     -12.106   6.485 -14.650  1.00 99.99           P  
... ATOM      2  OP1   C A 924     -12.981   6.565 -15.850  1.00 99.99           O  
... ATOM      3  OP2   C A 924     -10.829   7.256 -14.620  1.00 99.99           O 
... ATOM    429 2H4    C A 947       1.295  -1.142  -0.764  1.00 99.99           H  
... ATOM    430  P     G A 948      -2.886  -4.112   7.863  1.00 99.99           P   
... '''.splitlines()
>>> splitted.sort(key = lambda residue: int(residue.split()[5]))
>>> pdb_data = '\n'.join(splitted)
>>> print pdb_data
ATOM      1  P     C A 924     -12.106   6.485 -14.650  1.00 99.99           P  
ATOM      2  OP1   C A 924     -12.981   6.565 -15.850  1.00 99.99           O  
ATOM      3  OP2   C A 924     -10.829   7.256 -14.620  1.00 99.99           O 
ATOM    429 2H4    C A 947       1.295  -1.142  -0.764  1.00 99.99           H  
ATOM    430  P     G A 948      -2.886  -4.112   7.863  1.00 99.99           P   
ATOM   1591  O5'   G A 958       5.497  -3.281   3.598  1.00 99.99           O  
ATOM   1592  C5'   G A 958       4.345  -3.184   2.781  1.00 99.99           C