2016-07-26 129 views
0

我一直想弄清楚如何排序这些字典:d1d2里面的字典d3嵌套字典排序

d1 = {'eggs':1, 'cheese':1} 
d2 = {'cake':1, 'cream':1} 
d3 = {'breakfast':{},'dessert':{}} 
d3['breakfast'] = d1 
d3['dessert'] = d2 
for k,v in sorted(d3.items()): 
    for k,v in sorted(d3['breakfast'].items()): 
     for k,v in sorted(d3.items()): 
      print(k,v) 

这是输出:

breakfast {'eggs': 1, 'cheese': 1} 
dessert {'cream': 1, 'cake': 1} 
breakfast {'eggs': 1, 'cheese': 1} 
dessert {'cream': 1, 'cake': 1} 
breakfast {'eggs': 1, 'cheese': 1} 
dessert {'cream': 1, 'cake': 1} 
breakfast {'eggs': 1, 'cheese': 1} 
dessert {'cream': 1, 'cake': 1} 

它排序两个breakfastdessert正确,那里面dessert'cream''eggs'是在错误的顺序。

它应该是:

dessert {'cake':1, 'cream':1} 

,它还会打印“排序”字典d3四次,我不知道是什么原因。

据我所知,可能有更有效的方法来做到这一点,所以任何信息都是值得欢迎的。

+0

请解释你希望发生的事情(例如,你想看到什么输出),因为它不清楚你的问题。 – Amadan

+0

这是非逻辑的代码,因为你可以做最后的循环,你会得到两个输出,我没有得到你的代码 –

+0

你不应该有3个嵌套'for'循环都具有相同的循环变量(' k'和'v'),因为两个外部循环基本上只是让内部循环运行4次。请注意,仅仅执行'print(k,v)'就会打印出“v”作为整个字典未排序。 –

回答

2

所以你的算法有一些问题,主要是你嵌套的方式太多次,每次循环相同的东西。这里有一个更好的算法:

for k,v in sorted(d3.items()): 
    print(k + ":") 
    for k2,v2 in sorted(v.items()): 
     print("\t" + k2 + ", " + str(v2)) 

它格式化的回答是这样的:

breakfast: 
    cheese, 1 
    eggs, 1 
dessert: 
    cake, 1 
    cream, 1 

我不知道你的意图的格式是什么 - 希望你可以修改它是你想要的东西。如您所见,此次循环首先通过d3,,然后通过d3的元素迭代,而不是再次d3。这意味着您将在嵌套字典中深入到另一个层次,而不是在之前多次打印相同字典之前进行的操作。

+0

所以我试了一下,我不得不添加()到打印语句,因为它给了我一个错误,起初它没有工作,但然后我只是()围绕错误的东西。现在感谢它的工作!这只是一个测试代码,以了解它是如何工作的,然后将其实施到另一个正在开发的程序中。 – Doppel

+0

它不适合你吗?你是否打算做一些不同的事情?我需要更多的信息比 – James

+0

抱歉,我一直按输入,它发布评论时,我的意思是下线。即时通讯将尝试并将其实施到我的主程序,如果我需要一些更多的帮助,我可以将它添加到这个问题? – Doppel

0
d1 = {'eggs':1, 'cheese':1} 
d2 = {'cake':1, 'cream':1} 
d3 = {'breakfast':{},'dessert':{}} 
d3['breakfast'] = d1 
d3['dessert'] = d2 
for key,val in sorted(d3.items()): 
    print(key,val) 
+1

请编辑更多信息。仅限代码和“尝试这个”的答案是不鼓励的,因为它们不包含可搜索的内容,也不解释为什么有人应该“尝试这个”。 – abarisone