2015-08-21 13 views
6

ho il file denominato "names.txt" con i seguenti contenuti: dichiarazionedi analisi, di aggregazione e ordinamento file di testo in 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"]} 

Problema: File "names.txt" contiene alcuni record degli studenti in formato -

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

analizzare questo file e segregano loro secondo le anno e poi ordinare i nomi in base al rango. Prima segregazione e poi smistamento. uscita dovrebbe essere nel formato -

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

Così il risultato atteso è -

{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"]} 

Prima Come conservare questo il contenuto del file in un oggetto dizionario? Quindi raggruppare per anno & quindi ordinare i nomi per grado? Come ottenere questo risultato in Python?

Grazie ..

+5

Suoni sospettosamente come compiti a casa. Ma per dare una mano, suggerirei di esaminare il modulo 'json', che leggerà quel contenuto in python, quindi puoi modificarlo come un dizionario python, quindi puoi inviarlo di nuovo su un file in' json' – CasualDemon

+0

Quindi converti questa lista in un dizionario, forse dict.fromkeys() potrebbe aiutarti, oppure puoi organizzare la tua funzione/codice. Comunque consiglio di dare un'occhiata a json sia in python 2 che in python 3. – Llopis

+1

In nessun modo gli upvotes di +7 per una domanda "do my homework" sono legittimi. –

risposta

1

è molto semplice :)

#!/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

La segregazione può essere fatto con un collections.defaultdict in un semplice ciclo. Quindi un altro ciclo sugli elenchi degli studenti per ordinarli in base al valore intero dell'ultima parte delle voci dello studente. E pprint() stampe che l'output desiderato se convertiamo il defaultdict in un regolare uno:

#!/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

Spiegazione per il downvote per favore. – BlackJack