在保留顺序的同时从列表中删除具有重复值的多个条目

时间:2013-06-11 10:07:37

标签: python

我是一个Python菜鸟。经过几个小时的谷歌搜索,并搜索stackoverflow,我找不到解决问题的方法:

我使用外部脚本来读取包含分子活动信息的文件。一旦读取,数据将以下列形式列在列表中:

INACT67481 -10.84

即,分子的名称和活动值,由单个空格分隔。分子名称的长度差别很大。

现在,麻烦的是,每个分子可能有多个(最多n个)值,并且只应保留最高值,同时确保顺序不会更改(除了删除具有较小值的重复项)。

thisthis之类的线程的帮助下,我知道如何简单地删除重复项,但我很遗憾我只能删除值最小的那个,没有诉诸可怕的乱七八糟的循环。

编辑:我也可以在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

1 个答案:

答案 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