python - 按特定列对字符串进行排序

标签 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   

我想按第六列对它们进行排序(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'

但它没有排序。 :-/

最佳答案

您使用了错误的排序方法;要就地排序,请使用 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 

关于python - 按特定列对字符串进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27590790/

相关文章:

python - 如何获取单元测试的两个 pickle.dump 的内容?

python - 重新采样 ('W' )奇怪的结果

python - 按名称和等级排序

arrays - 为什么快速排序平均比其他排序快?

javascript - 如何使排序功能动态化

python - 计算(和写入)文本文件中每一行的词频

python - tempfile 和 listdir 奇怪的行为

python - Python OpenCV/PIL COLOR_BGR2RGB错误

给定幂集子集的和集时查找集合的算法

c# - Telerik RadGrid 排序 ASP.NET C#