2016-04-23 6 views
0

У меня есть json-файл с определенным форматом вывода.Нужна помощь в сортировке похожих значений в словаре на одном

{ 
    "courses": [ 
     { 
      "professors": [ 
       { 
        "first_name": "Zvezdelina", 
        "last_name": "Stankova", 
        "professor_url": "http://www.ratemyprofessors.com/ShowRatings.jsp?tid=375269", 
        "helpfullness": 4.3, 
        "clarity": 4.3, 
        "overall_rating": 4.3 
       } 
      ], 
      "course_name": "CHEM 1", 
      "course_mentioned_times": 37 
     }, 
     { 
      "professors": [ 
       { 
        "first_name": "Alan", 
        "last_name": "Shabel", 
        "professor_url": "http://www.ratemyprofessors.com/ShowRatings.jsp?tid=1309831", 
        "helpfullness": 3.9, 
        "clarity": 3.5, 
        "overall_rating": 3.7 
       } 
      ], 
      "course_name": "CHEMISTRY 5467", 
      "course_mentioned_times": 32 
     }, 
     { 
      "professors": [ 
       { 
        "first_name": "Kurt", 
        "last_name": "Spreyer", 
        "professor_url": "http://www.ratemyprofessors.com/ShowRatings.jsp?tid=706268", 
        "helpfullness": 3.8, 
        "clarity": 3.6, 
        "overall_rating": 3.7 
       } 
      ], 
      "course_name": "ESPM 50", 
      "course_mentioned_times": 18 
     }, 
     { 
      "professors": [ 
       { 
        "first_name": "Kurt", 
        "last_name": "Spreyer", 
        "professor_url": "http://www.ratemyprofessors.com/ShowRatings.jsp?tid=706268", 
        "helpfullness": 3.8, 
        "clarity": 3.6, 
        "overall_rating": 3.7 
       } 
      ], 
      "course_name": "ESPM 56", 
      "course_mentioned_times": 17 
     } 
    ] 
} 

Как показано на выходе, например, у нас есть в общей сложности четыре ['course_name']. Это «CHEM 1», «CHEMISTRY 5467», «ESPM 56», «ESPM 50» с «course_mentioned_times». Так что я не получаю, так это, как мне пройти через весь мой ключ classes_name в моем json-файле. Возьмите МОСТ упомянутые курсы из каждого класса, например, в этом случае. Я бы хотел просто CHEM 1 и его атрибуты, потому что он упоминается в 56 раз явно больше, чем CHEMISTRY 5476, и я бы хотел ESPM 50, потому что упоминается в 18 раз больше, чем ESPM 56, о котором упоминается только 17 раз. Поэтому я хотел бы, чтобы мой вывод имел эти 2 класса со всеми их атрибутами. Сравнение должно выполняться первыми буквами, пропускающими только целое число, например CHEM и CHEMISTRY, однако в моем представлении мне бы хотелось получить полное имя, а не только префиксы.

ответ

1

Ниже фрагмент код будет обновлять файл JSon с курсами с большинством упоминаний:

import json 

# Reading the json data from the source file = data.json 
with open('data.json') as data_file: 
    data = json.load(data_file) 

temp_data = data 
greater = [] 
len1 = len(data['courses']) 
len2 = len1 

for i in range(0,len1): 
    for j in range(0, len2): 
     if i==j: 
      continue 
     if data['courses'][i]['course_name'][0] == temp_data['courses'][j]['course_name'][0]: 
      if data['courses'][i]['course_name'][1] == temp_data['courses'][j]['course_name'][1]: 
       if data['courses'][i]['course_name'][2] == temp_data['courses'][j]['course_name'][2]: 
        if data['courses'][i]['course_mentioned_times']> temp_data['courses'][j]['course_mentioned_times']: 
         greater.append(i) 
        else: 
         greater.append(j) 


final = [] 
for i in greater: 
    if i not in final: 
    final.append(i) 

list_order = [] 

for i in range(0,len(data['courses'])): 
    list_order.append(i) 

new_final = [] 
for i in list_order: 
    if i not in final: 
     new_final.append(i) 

for i in new_final: 
    if i!=new_final[0]: 
     i=i-1 
    data['courses'].pop(i) 

# Writing the new json data back to data.json file. 
with open('data.json', 'w') as f: 
    json.dump(data, f) 

Выходом образца данных, предоставленными вами после запуска моего решения будет, как показано ниже:

{ 
    "courses": [ 
    { 
     "professors": [ 
     { 
      "first_name": "Zvezdelina", 
      "last_name": "Stankova", 
      "professor_url": "http://www.ratemyprofessors.com/ShowRatings.jsp?tid=375269", 
      "helpfullness": 4.3, 
      "clarity": 4.3, 
      "overall_rating": 4.3 
     } 
     ], 
     "course_name": "CHEM 1", 
     "course_mentioned_times": 37 
    }, 
    { 
     "professors": [ 
     { 
      "first_name": "Kurt", 
      "last_name": "Spreyer", 
      "professor_url": "http://www.ratemyprofessors.com/ShowRatings.jsp?tid=706268", 
      "helpfullness": 3.8, 
      "clarity": 3.6, 
      "overall_rating": 3.7 
     } 
     ], 
     "course_name": "ESPM 50", 
     "course_mentioned_times": 18 
    } 
    ] 
} 
+0

Извините. Мой вопрос в том, что. У меня есть ключ, называемый «курсы», значение которого является классом. Поэтому в моем json-файле у меня есть несколько названий курсов и сколько раз они упоминались. «course_name»: «CHEMISTRY 5467», «course_mentioned_times»: 32 У меня есть несколько курсов, таких как CHEM 452, CHEMISTRY 1234, CHEM 7634. ​​Я бы хотел сравнить «CHEM», CHEMISTRY и CHEM. Все они одинаковые. Итак, что я хочу сделать, просто добавьте наибольшее количество «упомянутых слов» в мой массив и все его атрибуты, такие как профессора и т. Д. – Benji

+0

например: в коде, который вы дали, CHEM 1 и CHEMISTRY 5467 - это то же самое? и вы хотите просто добавить значение курса с высшим курсом, указанным в массиве, который в этом случае будет CHEM 1 с 37 видами. и удалить ХИМИЯ 5467. Я прав? –

+0

Точно !. Так что, как мы видим, есть ли у них одни и те же курсы, нет, сравнивая «CHEM» и «CHEMISTRY». Если письмо такое же или выглядит одинаково. Затем просто добавьте наивысшие виды и удалите другой. – Benji