【问题标题】:Sorting a Dictionary with multiple Key:values pairs in the original key:value pair在原始键:值对中对具有多个键:值对的字典进行排序
【发布时间】:2023-03-14 09:17:01
【问题描述】:

我有一本字典:

bank_accts={accno:{"Name":"<str>","Balance":<num>}, repeat}.

我需要运行一个函数,用户可以通过按帐号 (accno)、姓名或余额排序来查看所有帐户。

我有一个 if、elif、else 语句,并且我的 sort by accno 工作正常。我似乎无法按名称或余额进行排序。我看过一些复杂的代码,但无法让它按照我需要的方式工作。所以我决定尝试将所有“名称”值放入一个列表中,然后我可以对其进行排序;然而,问题是每个值都被放入一个单独的列表中,每个字符都是分开的。

非常感谢任何帮助。我很新,几周后我就在新兵训练营学习 python。讲师更像是谷歌的答案,所以我正在努力学习。谢谢!

#This function will show all the bank accounts
def view_all_accts():
    sort=input("How would you like to sort? Please choose by account, name, or balance. ")
    if sort.lower() == "account":
        for acct in sorted(bank_acct.keys()):
            print("Account: %s" %(acct))
            for key in bank_acct[acct]:
                print(key +":"+str(bank_acct[acct][key]))
    elif sort.lower() == "name":
        for acct in bank_acct.keys():
            name=bank_acct[acct]["Name"]
            #gives every value of "Name"
            print(name)
            #will make every value into own list with each char separated
            temp=list(name)
            print(temp)
    #elif sort.lower()=="balance":
    else:
        print("Please choose account, name, or balance!")

【问题讨论】:

    标签: python list sorting python-3.x dictionary


    【解决方案1】:

    诀窍是在sorted()函数中使用key参数;这将允许我们使用我们想要的数据结构中的任何键作为排序的比较值。

    您想要做的另一件事是将程序有效地分成三个或多或少独立的部分:

    1. 获取用户输入
    2. 制作排序的数据结构
    3. 打印出这个数据结构。

    如果你不这样做,你最终会重复自己。在您的示例中,您正在循环并在两个地方打印出bank_acct - 现在如果您想稍后更改一些内容怎么办?您必须在两个地方进行更改;-)

    这是一个完整的示例,添加了注释:

    bank_accts = {
        '456': {"Name":"LaVey","Balance":666},
        '123': {"Name":"Adams","Balance":42},
        '999': {"Name":"Zelany","Balance":64},
    }
    
    def view_all_accts():
        #########################
        ### 1. Get user input ###
        #########################
        # Get input, lowercase it
        sort = input("How would you like to sort? Please choose by account, name, or balance. ").lower()
    
        # Check if this is a valid key 
        valid_keys = ['account', 'name', 'balance']
        if sort not in valid_keys:
            print("Please choose account, name, or balance!")
    
            # Ask for input again
            return view_all_accts()
    
        #######################################
        ### 2. Make a sorted data structure ###
        #######################################
        # The key name (account) is a special case, so handle that first
        if sort == 'account':
            sorted_list = sorted(bank_accts.items())
        # Sort by one of the values
        else:
            # Capitalize the first letter of the sort key
            sort_key = sort.capitalize()
    
            # Now we can use the key= parameter for sorted()
            sorted_list = sorted(bank_accts.items(), key=lambda v: v[1][sort_key])
    
        #########################################
        ### 3. Print out this data structure. ###
        #########################################
        for account, data in sorted_list:
            print("Account: %s" % account)
            for k, v in data.items():
                print("  %s: %s" % (k, v))
    
    view_all_accts()
    

    注意这个函数现在是如何分成三个独立的部分的——你现在可以移动到它们自己的函数的部分。

    【讨论】:

    • 谢谢!我明白你在做什么,这太棒了!有一个小错误,以防其他人使用它,在第 2 部分中,if sort = = 'account': 它应该是 sorted_dict=sorted(bank_acct.items())。另外,不要忘记在开始之前添加 sorted_dict={} 。此外,这确实将所有 3 次搜索的格式限制为相同,这可能需要也可能不需要。再次感谢!
    • @Tigger 哎呀,我测试了代码,将其复制到答案中,并更改了一些小细节并添加了 cmets。在那之后我忘了测试它>_sorted_dict={}?首先,它是一个列表而不是一个字典(是的,名字很傻,我把它改成了sorted_list),但更重要的是,它总是被设置的......
    【解决方案2】:

    您的主词典将 accno 作为键。 创建 2 个索引字典,将 name 和 balance 作为键,将 accno 作为 value 列表的元素。 (因为一个名字或余额可以出现多次)

    每次在 prim dict 中插入时,也会在 index dicts 中的右键下插入。

    每次从 prim 中删除。 dict.,还使用名称和余额作为键从索引字典中删除。当名称或余额的列表变空时,删除索引的整个元素。

    您现在可以简单地对每个字典中的键进行排序。这是(正常的)“数据库索引”。

    【讨论】:

      【解决方案3】:

      感谢您的意见!我喜欢地毯吸烟者的回答。我自己也提出了以下解决方案,并且会为我的另一个值“Balance”重复该 elif 语句:

      elif sort.lower() == "name":
              temp=[]
              for acct in bank_acct.keys():
                  temp.append(bank_acct[acct]["Name"])
              #print(temp)
                  temp.sort()
              #print(temp)
              for name in temp:
                  for acct in bank_acct.keys():
                      if name==bank_acct[acct]["Name"]:
                          print("Name: %s, Balance: $%d, Account #%s" %(bank_acct[acct]["Name"],bank_acct[acct]["Balance"],acct))
      

      【讨论】:

        猜你喜欢
        • 2015-04-06
        • 1970-01-01
        • 1970-01-01
        • 2019-12-30
        • 2011-07-08
        • 1970-01-01
        • 2017-10-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多