【问题标题】:How to rank tuple value in nested dictionary如何在嵌套字典中对元组值进行排名
【发布时间】:2016-02-24 02:48:03
【问题描述】:

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

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]

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 好的,抱歉。第一次问问题。我必须找出如何更新
  • 我更新正确了吗?
  • 我在您的“数据库”中添加了一些换行符,希望更清楚您从什么数据开始——但是,在我看来,您还没有得到所有的括号/大括号放在正确的位置。
  • 我不明白您对数据库所做的更改。第一个字典键是字符串元组,值是另一个字典,键是年份,值是整数元组。

标签: python sorting dictionary tuples ranking


【解决方案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)

【讨论】:

  • 我收到一个属性错误。字典没有属性 ititems。不知道这意味着什么,但我想我可以看到你想要做什么。
  • 如果您打算教一些东西,可能需要更多解释。不过,由于不清楚 OP 不了解什么,因此不清楚具体要解释什么......
  • @Adele 如果你使用 Python 3 items() 而不是 iteritems() 应该可以工作
  • 是的。太感谢了!!!我了解大部分代码是如何工作的,但我不确定 seq 和 animal_type 来自哪里。我知道它们是参数,但是 python 怎么知道要使用什么值?
  • 更新函数是在rank_names_for_one_year里面定义的,在rank_names_for_one_year的最后两行执行,seq和animal_type在这里传递,我这样做是为了不写两次相同的代码
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 2021-05-31
  • 2020-04-29
  • 2014-05-01
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 2022-01-27
相关资源
最近更新 更多