0

我是 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

提前感谢您的帮助!

4

2 回答 2

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 或列表理解以单行方式编写,但我喜欢从简单开始

以防万一您需要对结果进行排序,有很多方法可以做到这一点,但我认为理解在 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)

于 2013-01-28T23:37:10.140 回答
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获得每个组中的最大值。

最后,我们打印出组的键和最大值。

于 2013-01-28T23:59:01.177 回答