【问题标题】:Sorting string by specific column按特定列对字符串进行排序
【发布时间】:2014-12-21 23:38:42
【问题描述】:

我需要对文本文件进行排序。该文件包含由新行 '\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'

但它没有排序。 :-/

【问题讨论】:

    标签: python sorting


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2015-11-27
      • 1970-01-01
      • 1970-01-01
      • 2019-09-20
      • 2021-10-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 2013-06-11
      相关资源
      最近更新 更多