如何在嵌套字典中对元组值进行排名

时间:2015-11-21 17:48:24

标签: python sorting dictionary tuples ranking

我正在尝试创建一个接受数据库和一年的函数,它根据计数计算名称的排名,然后更新数据库。

database = {('Spot','DOG'): {2013: (612, 1), 2014: (598, 3)},
            ('Princess','CAT'): {2013: (713, 2)},
            ('Smokey', 'CAT'): {2013: (523, 1), 2014: (514, 1)},
            ('Fido', 'DOG'): {2013: (558, 2), 2014: (655, 1)},
            ('Sparky','DOG'): {2104: (572, 2)}}

我必须分别对猫和狗进行排名,最流行的名字是等级1,所以降序排列。

我只允许使用基本表达式和语句,len, range, enumerate, int, get, items, keys, values, pop, copy, popitem, update, append, insert, extend,min, max, index, split, join, replace, sorted, sort, reversed, reverse, sets以及基本表达式和语句,我可以编写自己的函数并使用它们。

我无法在允许列表中导入模块或使用lambda或其他任何东西。这就是我被困的原因。这是我的第一个编程课程。我不知道如何对元组进行排序。我知道如何对嵌套字典进行排序,这里有一篇很棒的帖子,但是我坚持这个元组。能否请你帮忙。

def rank_names_for_one_year(db, year):
    list = []
    list_2 = []
    for k in db:
        if 'MALE' in k:
            for key in db[k]:
                if year == key:
                    for n in db[k][year]:
                        list.append(n)
                        break
        if 'FEMALE' in k:
            for key in db[k]:
                if year == key:
                    for n in db[k][year]:
                        list_2.append(n)
                        break
    list.sort()
    new_list = [()]
    list_2.sort()
    new_list_2 = [()]

    for k in db:
        if 'MALE' in k:
            for i in range(len(list)):
                new_list.append((list[i],i+1))
            for key in db[k]:
                if year == key:
                    for n in db[k][year]:
                        for i in range(len(new_list)):
                            for j in range(len(new_list[i])):
                                if new_list[i][j] == n:
                                    db[k][year] = new_list[i]
        if 'FEMALE' in k:
            for i in range(len(list_2)):
                new_list_2.append((list_2[i],i+1))
            for key in db[k]:
                if year == key:
                    for n in db[k][year]:
                        for i in range(len(new_list_2)):
                            for j in range(len(new_list_2[i])):
                                if new_list_2[i][j] == n:
                                    db[k][year] = new_list_2[i]

1 个答案:

答案 0 :(得分:1)

database = {('TEST','DOG'):{2013:(612,1), 2014:(598,3)}, ('Spot','DOG'):{2013:(612,1), 2014:(598,3)},('Princess','CAT'):{2013:(713,2)},
            ('Princess1','CAT'):{2013:(713,2)},('Smokey', 'CAT'):{2013:(523,1), 2014:(514,1)},('Smokey1', 'CAT'):{2013:(523,1), 2014:(514,1)},('Fido', 'DOG'):{2013:(558, 2), 2014:(655, 1)},('Sparky','DOG'):{2104:(572,2)}}

def rank_names_for_one_year(db, year):
    temp = {'DOG' : [], 'CAT' : []}
    for k, v in db.items():
        if year not in v:
            continue
        temp[k[1]].append((v[year][0], k[0]))

    for animal_type, v in temp.items():
        rank = 0
        countPrev = -1
        for i, (count, name) in enumerate(reversed(sorted(v))):
            if countPrev != count:
                rank = i + 1
            countPrev = count
            db[(name, animal_type)][year] = (count, rank)


rank_names_for_one_year(database, 2013)