2017-08-14 48 views
2

的名单我,当我使用排序排序字典的名单有这样使用字典

student_data = [{'id':1, 'Hacker' : 'DOSHI', 'Rank' : 43}, 
{'id':2, 'Hacker' : 'JOSHI', 'Rank' : 45}, 
{'id':3, 'Hacker' : 'MOSHI', 'Rank' : 41}, 
{'id':4, 'Hacker' : 'LOSHI', 'Rank' : 98}, 
{'id':5, 'Hacker' : 'AOSHI', 'Rank' : 14}] 

字典数据,我的代码是

print sorted(student_data), 

输出是:

[{'Hacker': 'AOSHI', 'id': 5, 'Rank': 14}, 
{'Hacker': 'DOSHI', 'id': 1, 'Rank': 43}, 
{'Hacker': 'JOSHI', 'id': 2, 'Rank': 45}, 
{'Hacker': 'LOSHI', 'id': 4, 'Rank': 98}, 
{'Hacker': 'MOSHI', 'id': 3, 'Rank': 41}] 

根据关键“黑客”排序的字典列表,我想根据“排名”对数据进行排序。
可以任意一个解释为什么字典列表使用键“黑客”来排序?其他键是“id”和“Rank”,但是根据不是第一个键而是选择排序元素的“Hacker”进行排序。

+0

的可能的复制[如何排序的值的词典列表字典在Python?](https://stackoverflow.com/questions/72899/how-do-i-sort-a-list-of-dictionaries-by-values-of-the-dictionary-in-python) –

+0

@ ThomWiggers我不同意,因为他询问'为什么'是根据这个领域,除了修复。 – kabanus

回答

2

默认排序是根据'第一'键,你不能控制(似乎字母对我来说,但我不确定 - 可能是根据关键哈希)。这对许多人来说没有多少意义和惊喜。

为了详细说明,关于字典的'first'和'second'的概念是未定义的。 字典是散列,不保证密钥的顺序,通过设计。 这是一种技术方式,如果两个具有相同密钥的不同字典使它们保持相同的顺序 - 特别是记住一个密钥不必是一个字符串!因此,就你而言,“黑客”的选择首先可能是随机的。

因此,你需要明确,这是用在Python(itemgetter是平时最爱吃的)强制3.一个选项,而不另一库:

sorted(student_data,key=lambda x: x['Rank']) 

在Python 3,如果你尝试sorted(student_data),异常会出现一个错误,因为dict1 < dict2未定义。在Python 2中,这不会导致您遇到的混淆。

+0

谢谢,但我想知道为什么选择第二个键来对数据进行排序? –

+0

@GauravRathore见编辑。基本上,字典键的顺序是没有保证的,在你的情况下它恰好是'黑客'。因此,需要明确,以确定“dict1应该在dict2之前出现”的含义。 – kabanus

1

必须通过钥匙等级的值指定您将如何排序列表的方式,你的情况:

from operator import itemgetter 

student_data = [{'id':1, 'Hacker' : 'DOSHI', 'Rank' : 43}, 
{'id':2, 'Hacker' : 'JOSHI', 'Rank' : 45}, 
{'id':3, 'Hacker' : 'MOSHI', 'Rank' : 41}, 
{'id':4, 'Hacker' : 'LOSHI', 'Rank' : 98}, 
{'id':5, 'Hacker' : 'AOSHI', 'Rank' : 14}] 
result = sorted(student_data, key=itemgetter('Rank')) 

print(result) 

[{'id': 5, 'Hacker': 'AOSHI', 'Rank': 14}, {'id': 3, 'Hacker': 'MOSHI', 'Rank': 41}, {'id': 1, 'Hacker': 'DOSHI', 'Rank': 43}, {'id': 2, 'Hacker': 'JOSHI', 'Rank': 45}, {'id': 4, 'Hacker': 'LOSHI', 'Rank': 98}]