2015-08-21 15 views
6

Ich habe die Datei mit dem Namen „names.txt“ mit dem folgenden Inhalt:Parsing, Aggregieren und Sortieren von Textdatei 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"]} 

Problemstellung: Die Datei „names.txt“ enthält einige Schüler Aufzeichnungen im Format -

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

diese Datei parsen und alle betroffenen sie nach Jahr und dann sortieren sie die Namen nach Rang. Erstes Trennen und dann sortieren. Ausgabe sollte im Format -

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

So ist die erwartete Ausgabe ist -

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

Zuerst Wie diese Datei Inhalt in einem Dictionary-Objekt speichern? Dann Gruppierung nach Jahr & dann Reihenfolge der Namen nach Rang? Wie erreiche ich das in Python?

Dank ..

+5

Sounds verdächtig nach den Hausaufgaben. Aber um eine Hand zu reichen, würde ich vorschlagen, in das 'json'-Modul zu schauen, das diesen Inhalt in Python liest, dann kann man es als Python-Wörterbuch modifizieren, dann kann man es wieder in eine Datei in' json' – CasualDemon

+0

ausgeben Dann konvertiere diese Liste in ein Wörterbuch, vielleicht hilft dict.fromkeys(), oder du kannst deine eigene Funktion/deinen eigenen Code einrichten. Allerdings empfehle ich einen Blick auf Json entweder in Python 2 oder Python 3. – Llopis

+1

Kein Weg die +7 upvotes für eine "mach meine Hausaufgabenfrage" sind echt. –

Antwort

1

Ganz einfach :)

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

Die Trennung kann mit einem collections.defaultdict in einer einfachen Schleife erfolgen. Dann eine weitere Schleife über die Schülerlisten, um sie nach dem ganzzahligen Wert des letzten Teils der Schülereinträge zu sortieren. Und pprint() druckt die gewünschten ouput, wenn wir die defaultdict in eine reguläre konvertieren:

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

Erklärung für den Downvote bitte. – BlackJack