Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何对嵌套字典中的元组值进行排序_Python_Sorting_Dictionary_Tuples_Ranking - Fatal编程技术网

Python 如何对嵌套字典中的元组值进行排序

Python 如何对嵌套字典中的元组值进行排序,python,sorting,dictionary,tuples,ranking,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', 'D

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

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、key、value、pop、copy、popitem、update、append、insert、extend、min、max、index、split、join、replace、sorted、sort、reversed、set
和基本表达式和语句,我可以编写自己的函数并使用它们

我不能导入模块或使用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]

到目前为止你都试了些什么?好的,对不起。第一次问问题。我必须找出如何更新我是否正确地更新了它?我在“数据库”中添加了一些换行符,希望它能更清楚地显示您开始使用的数据--但是,在我看来,您没有将所有括号/大括号放在正确的位置。我不理解您对数据库所做的更改。第一个字典键是字符串的元组,值是另一个字典,一年作为键,一个整数元组作为值。字典没有iteritems属性。我不知道这意味着什么,但我想我能看到你在试图做什么。如果你打算教一些东西,可能需要更多的解释。尽管如此,由于OP不理解的内容还很不清楚,所以具体解释什么也不清楚…@Adele如果您使用Python 3 items()而不是iteritems()应该有效是的。非常感谢你!!!我理解大多数代码是如何工作的,但我不确定seq和animal_类型来自哪里。我知道它们是参数,但是python如何知道要使用什么值呢?更新函数是在rank_names_for_one_year中定义的,它在rank_names_for_one_year的最后两行中执行,seq和animal_type被传递到那里,我这样做是为了避免两次编写相同的代码
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)