我是一个Python菜鸟。经过几个小时的谷歌搜索,并搜索stackoverflow,我找不到解决问题的方法:
我使用外部脚本来读取包含分子活动信息的文件。一旦读取,数据将以下列形式列在列表中:
INACT67481 -10.84
即,分子的名称和活动值,由单个空格分隔。分子名称的长度差别很大。
现在,麻烦的是,每个分子可能有多个(最多n个)值,并且只应保留最高值,同时确保顺序不会更改(除了删除具有较小值的重复项)。
在this和this之类的线程的帮助下,我知道如何简单地删除重复项,但我很遗憾我只能删除值最小的那个,没有诉诸可怕的乱七八糟的循环。
编辑:我也可以在python中重写文件解析脚本,如果以不同的形式获得数据会更容易。
编辑:示例数据:
CHEMBL243059.smi 11.75
CHEMBL115092.smi 10.49
CHEMBL244771.smi 10.79
CHEMBL471221.smi 10.78
CHEMBL573301.smi 10.77
CHEMBL469583.smi 10.77
CHEMBL115092.smi 10.97
CHEMBL244771.smi 8.95
CHEMBL16781.smi 10.76
CHEMBL440776.smi 10.76
CHEMBL243059.smi 10.75
CHEMBL115092.smi 10.69
应该返回:
CHEMBL243059.smi 11.75
CHEMBL244771.smi 10.79
CHEMBL471221.smi 10.78
CHEMBL573301.smi 10.77
CHEMBL469583.smi 10.77
CHEMBL115092.smi 10.97
CHEMBL16781.smi 10.76
CHEMBL440776.smi 10.76
答案 0 :(得分:2)
from collections import OrderedDict
D = OrderedDict()
with open("fin.txt") as fin:
for line in fin:
if line.isspace(): # Guard against empty lines
continue
molecule, sep, activity = line.partition(" ")
activity = float(activity)
if molecule in D:
if activity > D[molecule]:
D[molecule] = activity
D.move_to_end(molecule)
else:
d[molecule] = activity