2015-08-21 29 views
6

yılında sıralama metin dosyası ben dosya adında var "names.txt" sahip aşağıdaki içeriği:Ayrıştırma, Toplamak ve 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"]} 

Sorun ifadesi: Dosya "names.txt" biçiminde bazı öğrenci kayıtları içerir -

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

bu dosyayı ayrıştırma ve yıla göre onları ayrı tutun ve sonra rütbelerine göre isimleri sıralamak. İlk ayrım ve sonra sıralama. Çıktı biçiminde olmalıdır -

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

Yani beklenen çıkışı -

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

İlk Nasıl bir sözlük nesnede bu dosya içeriğini saklamak için? Daha sonra & yılına göre gruplandırılıyor, sonra sıralama isimleri sıralanıyor? Bunu Python'da nasıl başarabilirim?

Teşekkür ..

+5

Sesler. Ama bir eli ödünç vermek için, bu içeriği python'a okuyacak olan json modülüne bakmanızı öneririm, sonra bunu bir python sözlüğü olarak değiştirebilirsin, sonra tekrar json' – CasualDemon

+0

’daki bir dosyaya verebilirsin Sonra bu listeyi bir sözlüğe dönüştürün, belki de dict.fromkeys() yardımcı olabilir veya kendi işlevinizi/kodunuzu düzenleyebilirsiniz. Ancak, python 2 veya python 3'te json'a bir göz atmanızı tavsiye ederim. – Llopis

+1

"Ev ödevi sorusu için" bir upvot'lar yasal değildir. –

cevap

1

Onun Çok Basit :)

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

segregasyon basit döngü içinde bir collections.defaultdict ile yapılabilir. Daha sonra öğrenciler üzerinde bir başka döngü, öğrenci girişlerinin son kısmının tamsayı değerine göre sıralamak için listeler. Ve pprint() baskılar biz düzenli birine defaultdict dönüştürmek eğer istenen çıktıya: şüpheyle ödevi gibi

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

Reddinin açıklaması lütfen. – BlackJack