2015-08-21 2 views
6

я файл с именем «names.txt», имеющие следующее содержание:Синтаксических, Агрегирование и сортировка текстовых файлов в Python

{"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?

Спасибо ..

+5

звуки подозрительно, как домашнее задание. Но, чтобы протянуть руку, я бы предложил заглянуть в модуль 'json', который будет читать это содержимое на python, а затем вы можете изменить его как словарь python, затем вы можете вывести его снова в файл в' json' – CasualDemon

+0

Затем конвертируйте этот список в словарь, возможно, dict.fromkeys() может помочь, или вы можете организовать свою собственную функцию/код. Тем не менее, я рекомендую посмотреть на json либо в python 2, либо на python 3. – Llopis

+1

Никоим образом не разрешены «+7» для «делать мой домашний вопрос». –

ответ

1

его очень просто :)

#!/usr/bin/python 
# Program: Parsing, Aggregating & Sorting text file in Python 
# Developed By: Pratik Patil 
# Date: 22-08-2015 

import pprint; 

# Open file & store the contents in a dictionary object 
file = open("names.txt","r"); 
file_contents=eval(file.readlines().pop(0)); 

# Extract all lists from file contents 
file_contents_values=file_contents.values(); 

# Extract Unique Years & apply segregation 
year=sorted(set(map(lambda x:x[0], file_contents_values))); 
file_contents_values_grouped_by_year = [ [y[1] for y in file_contents_values if y[0]==x ] for x in year]; 

# Create Final Dictionary by combining respective keys & values 
output=dict(zip(year, file_contents_values_grouped_by_year)); 

# Apply Sorting based on ranking 
for NameRank in output.values(): 
    NameRank.sort(key=lambda x: int(x.split()[1])); 

# Print Output by ascending order of keys 
pprint.pprint(output); 
-1

сегрегация может быть сделано с помощью collections.defaultdict в простом цикле. Затем еще один цикл над списками студентов сортирует их по целочисленному значению последней части записей ученика. И pprint() печатает желаемый Ouput если преобразовать 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() 
+0

Пояснение для downvote. – BlackJack

Смежные вопросы