我需要对文本文件进行排序。该文件包含由新行 '\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
我想按第六列对它们进行排序(958
、924
等)
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/