6

次の内容を持つ「names.txt」という名前のファイルがあります。

{"1":[1988, "Anil 4"], "2":[2000, "Chris 4"], "3":[1988, "Rahul 1"],
"4":[2001, "Kechit 3"], "5":[2000, "Phil 3"], "6":[2001, "Ravi 4"],
"7":[1988, "Ramu 3"], "8":[1988, "Raheem 5"], "9":[1988, "Kranti 2"],
"10":[2000, "Wayne 1"], "11":[2000, "Javier 2"], "12":[2000, "Juan 2"],
"13":[2001, "Gaston 2"], "14":[2001, "Diego 5"], "15":[2001, "Fernando 1"]}

問題文 : ファイル "names.txt" には、次の形式の生徒の記録がいくつか含まれています -

{"number": [year of birth, "name rank"]}

このファイルを解析し、年に従ってそれらを分離し、ランクに従って名前を並べ替えます。最初に分離し、次にソートします。出力は次の形式にする必要があります -

{year : [Names of students in sorted order according to rank]}

したがって、期待される出力は -

{1988:["Rahul 1","Kranti 2","Rama 3","Anil 4","Raheem 5"],
2000:["Wayne 1","Javier 2","Jaan 2","Phil 3","Chris 4"],
2001:["Fernando 1","Gaston 2","Kechit 3","Ravi 4","Diego 5"]}

まず、このファイルの内容を辞書オブジェクトに保存する方法は? 次に、年ごとにグループ化し、ランクごとに名前を並べ替えますか? Pythonでこれを達成するにはどうすればよいですか?

ありがとう..

4

2 に答える 2

-1

分離はcollections.defaultdict、単純なループで実行できます。次に、生徒のリストをもう一度ループして、生徒のエントリの最後の部分の整数値に従って並べ替えます。を通常pprint()の出力に変換すると、目的の出力が出力されます。defaultdict

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function
import json
from collections import defaultdict
from pprint import pprint


def main():
    with open('test.json') as student_file:
        id2student = json.load(student_file)
    # 
    # Segregate by year.
    # 
    year2students = defaultdict(list)
    for year, student_and_rank in id2student.itervalues():
        year2students[year].append(student_and_rank.encode('utf8'))
    # 
    # Sort by rank.
    # 
    for students in year2students.itervalues():
        students.sort(key=lambda s: int(s.rsplit(' ', 1)[-1]))

    pprint(dict(year2students))


if __name__ == '__main__':
    main()
于 2015-08-22T12:35:42.320 に答える