从(ID,数字)对中仅保留包含最大数字的对

时间:2013-01-28 23:30:37

标签: python regex

我是python的新手,我想帮助解决一个小问题。我有一个文件,每行有一个ID加上一个相关的号码。可以将多个号码关联到同一ID。如何在python中只获取ID加上与之关联的最大数字?

示例:

输入:ID_file.txt

ENSG00000133246 2013
ENSG00000133246 540
ENSG00000133246 2010
ENSG00000253626 465
ENSG00000211829 464
ENSG00000158458 2577
ENSG00000158458 2553

我想要的是以下内容:

ENSG00000133246 2013
ENSG00000253626 465
ENSG00000211829 464
ENSG00000158458 2577

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我认为有很多方法可以做到这一点我会使用字典

from collections import defaultdict

id_value_dict = defaultdict()
for line in open(idfile.txt).readlines():
    id, value = line.strip().split()
    if id not in id_value_dict:
        id_value_dict[id] = int(value)
    else:
        if id_value_dict[id] < int(value):
            id_value_dict[id] = int(value)

下一步是写出字典

out_ref = open(outputfile.txt,'w')
for key, value in id_value_dict:
    outref.write(key + '\t' + str(value)

outref.close()

有更简单的方法可以做到这一点,我认为字典可以使用lamda或list-comprehension以单行编写,但我喜欢开始简单

万一你需要排序的结果有很多方法可以做到这一点但我认为理解使用python中的列表和词典是至关重要的,因为我发现学习思考正确的数据容器通常是解决我的许多问题的关键,但我仍然是一个新的问题。如果您需要排序结果,那么任何方式都是直截了当的

 id_value_dict.keys().sort() 

所以这是关于python id_value__dict.keys()的一个光滑的事情是字典排序的键列表

 out_ref = open(outputfile.txt,'w')
 for key in id_value_dict.keys():
     outref.write(key + '\t' + str(id_value_dict[key])

 outref.close()

它真的很棘手,因为你可能想要(我知道我一直想要)代码

  my_sorted_list = id_value_dict.keys().sort()

但是你会发现my_sorted_list不存在(NoneType)

答案 1 :(得分:1)

鉴于您的输入只包含每个ID的连续运行 - 也就是说,只要您看到另一个ID,就再也看不到之前的ID了 - 您可以这样做:

import itertools
import operator

with open('ID_file.txt') as idfile, open('max_ID_file.txt', 'w') as maxidfile:
    keyvalpairs = (line.strip().split(None, 1) for line in idfile)
    for key, group in itertools.groupby(keyvalpairs, operator.itemgetter(0)):
        maxval = max(int(keyval[1]) for keyval in group)
        maxidfile.write('{} {}\n'.format(key, maxval))

要看看这是做什么的,让我们逐行检讨。

文件只是一个可迭代的行,所以for line in idfile意味着你所期望的。对于每一行,我们调用strip去掉无关的空格,然后split(None, 1)将它分割到第一个空格,所以我们最终得到一个可迭代的字符串对。

接下来,我们使用groupby将其更改为可迭代的(键,组)对。尝试打印list(keyvalpairs)以查看其外观。

然后我们迭代它,并使用max来获得每个组中的最大值。

最后,我们打印出该组的密钥和最大值。