Python IndexError - 需要帮助排序键和值

时间:2016-04-23 22:27:49

标签: python arrays dictionary key

我需要帮助排序我的键值对。我的输出在此网址http://pastebin.com/ckKAtP5y中。 但是,我一直在努力做的事情。

$data

所以我想要做的是我想在“course_name”中比较'CHEM'和'CHEMISTRY',然后让我获得最多'course_tioned_times'并删除另一个。在这种情况下,我想要化学231,因为它被提到了50次。

到目前为止,这是我得到的帮助。

{
    "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 231",
     "course_mentioned_times": 50
    }
]

这段代码给了我一个IndexError     数据[ '课程']。弹出(I) IndexError:pop index超出范围

2 个答案:

答案 0 :(得分:1)

经过多次来回询问后的评论:

#coding:utf-8

import json

filename = 'data.json'

with open(filename, 'r') as f:
    data = json.load(f)
    courses = data.get('courses', None)

    if courses:
        keys = sorted(set([course.get('course_name', None).strip().split()[0][0:3] for course in courses]))

        results = {'courses': {}}

        for key in keys:
            results['courses'][key] = []
            temp = {}
            for course in courses:
                course_name = course.get('course_name', None)
                professors = course.get('professors', None)
                if course_name.strip().split()[0][0:3] == key:
                    course_mentioned_times = course.get('course_mentioned_times')
                    temp[course_name] = {'course_mentioned_times':course_mentioned_times, 'professors': professors}
            results['courses'][key] = temp
    else:
        raise Exception('No courses could be found on {}'.format(filename))

def get_most_mentioned(name):
    name = name[0:3]
    data = results.get('courses', None).get(name)
    max_mentioned_times = max(map(lambda m: data.get(m, None).get('course_mentioned_times'), data.keys()))

    most_mentioned = []
    for course_name, values in data.items():
        course_mentioned_times = values.get('course_mentioned_times', None)
        if course_mentioned_times == max_mentioned_times:
            most_mentioned.append({'course_name': course_name, 'course_mentioned_times': course_mentioned_times, \
                'professors': values.get('professors')})
    return most_mentioned

print "Course with most mentioned times:"
print "---------------------------------"
for key in keys:
    print "[*] For Key '{}':".format(key)
    for item in get_most_mentioned(key):
        course_name = item.get('course_name', None)
        print "    Course Name: {}".format(course_name)
        print "    Mentioned Times: {}\n".format(item.get('course_mentioned_times'))
        print "    Professors:\n"
        for i, professor in enumerate(item.get('professors', None), start=1):
            print "         {}) Full name: {} {}".format(i, professor.get('first_name'), professor.get('last_name'))
            print "            URL: {}".format(professor.get('professor_url'))
            print "            Helpfullness: {}".format(professor.get('helpfullness'))
            print "            Clarity: {}".format(professor.get('clarity'))
            print "            Overall_rating: {}".format(professor.get('overall_rating'))
            print ""
    print ""

答案 1 :(得分:1)

import json
import collections

with open('output_info.json') as data_file:
    data = json.load(data_file)

courses = data['courses']

courses_by_prefix = collections.defaultdict(list)

for course in courses:
    prefix = course['course_name'].split(' ', 2)[0].upper()[:3]
    courses_by_prefix[prefix].append(course)


results = []

for prefix, courselist in courses_by_prefix.items():
    mosttimes = max(courselist, key=lambda c: c['course_mentioned_times'])
    results.append(mosttimes)

print(results)