0

私はPythonが初めてで、小さな問題の助けが必要です. 各行に ID と関連する番号が含まれるファイルがあります。複数の番号を同じ ID に関連付けることができます。IDとそれに関連付けられた最大の番号だけをPythonで取得するにはどうすればよいですか?

例:

入力: 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()

これを行うためのよりスマートな方法があります。辞書は、ラムダまたはリスト内包表記を使用してワンライナーで記述できると思いますが、簡単に始めるのが好きです

結果をソートする必要がある場合に備えて、それを行う方法はたくさんありますが、適切なデータ コンテナーについて考えることを学ぶことが通常の鍵であることがわかったので、python でのリストと辞書の操作を理解することが重要だと思います。私の問題の多くを解決しますが、私はまだ新しいです。ソートされた結果が必要な場合は、簡単に

 id_value_dict.keys().sort() 

SO これは python id_value__dict.keys() についての巧妙なことの 1 つであり、並べ替えられた辞書のキーのリストです。

 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)、最初のスペースで分割するために呼び出しているため、文字列のペアでいっぱいの iterable になります。

次に、それをgroupby(キー、グループ) のペアでいっぱいのイテラブルに変更するために使用します。印刷しlist(keyvalpairs)てみて、どのように表示されるかを確認してください。

次に、それを反復処理しmax、各グループの最大値を取得するために使用します。

最後に、グループのキーと最大値を出力します。

于 2013-01-28T23:59:01.177 に答える