使用原始键:值对中的多个键:值对对字典进行排序

时间:2016-03-25 16:36:32

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

我有一本字典:

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

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

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

非常感谢任何帮助。我很新,我在几个星期内在学习python的训练营。教练更像是Google的答案,所以我正在努力学习。谢谢!

#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!")

3 个答案:

答案 0 :(得分:0)

您的主要词典已被确认为关键字。 创建2个索引词典,将名称和余额作为键,并将其作为值列表的元素。 (因为名称或余额可以多次出现)

对于prim dict中的每个插入,也插入右键下的索引dicts。

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

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

答案 1 :(得分:0)

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

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

  1. 获取用户输入
  2. 制作排序数据结构
  3. 打印出此数据结构。
  4. 如果你不这样做,你最终会重复自己。在您的示例中,您正在循环并在两个位置打印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 :(得分:0)

感谢您的投入!我喜欢carpetsmoker的回答。我自己也提出了以下解决方案,并将重复该elif语句以获取我的其他值“Balance”:

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))