您的位置:首页 > 其它

如何根据字典的键或值来排序

2016-07-24 18:26 330 查看
在Python中的字典是一个非常有用的容器,可以存储一些值的集合,并且可以通过键来访问它。字典的值可以是任何对象类型(字典甚至可以嵌入另一个字典中),键可以为任何可hash的对象,也就是它不可以被改变(所以字符串并不是唯一合法的键,但是可变的比如列表就绝对不能作为键)。不想Python的列表或者元组,在dict对象中的键值对并没有特别的顺序,也就意味着我们可以有一个如下的字典:

numbers={'first': 1, 'second': 2, 'third': 3, 'Fourth': 4}



尽管在实例化语句中键值对有特定的序列,但是通过调用list方法(也就是用它的键创建一个列表)我们可以很容易看到它并不是以实例化的顺序进行存储:

>>> list(numbers)
['second', 'Fourth', 'third', 'first']

根据字典的键排序

如果我们想根据字典的键来进行排序,最简单的方法是使用Python的内置函数sorted(),该函数接收一个iterable,并返回已排好序的列表(默认情况下是从小到大排序)。不像列表,对字典的排序没有类方法。但是,sorted方法如同列表一样作用在字典上。如下是对字典排序的结果:

# This is the same as calling sorted(numbers.keys())
>>> sorted(numbers)
['Fourth', 'first', 'second', 'third']
我们看到该方法返回一个按字母顺序以升序排列的键的值的列表,依赖于我们是如何定义“字母顺序表”。注意我们根据它的键对键的列表排序。如果我们想对根据列表的键的值进行排序,我们必须改变我们使用sorted的方法。我们将会看到sorted的不同方面。

根据字典的值排序

用我们对键排序的相同的手段,我们可以使用sorted来对Python的字典根据值来排序:
# We have to call numbers.values() here
>>> sorted(numbers.values())
[1, 2, 3, 4]
这是一个值得列表,默认顺序为升序。这些是一些非常简单的例子,那让我们看一下如何对一些稍微复杂字典对象进行排序。

自定义Python字典的排序算法

如果我们只是简单地将字典的键/值作为参数传入sorted方法,那它将执行简单的排序,但是如果我们利用它的其它的参数(比如key和reverse)我们可以完成更复杂的排序。
sorted函数的参数key(不要和字典的keys相混淆)允许,用我们定义指定的函数对items,作为一个iterator(在我们的dict对象中)进行排序。在上面的两个例子中,键和值都是我们用来排序并且比较的items,但是,如果我们想根据字典的值对字典的键进行排序,那么我们就要通过key参数告诉sorted。如下所示:
# Use the __getitem__ method as the key function
>>> sorted(numbers, key=numbers.__getitem__)
# In order of sorted values: [1, 2, 3, 4]
['first', 'second', 'third', 'Fourth']
通过这个语句,我们告诉sorted方法对numbers dict(它的键)进行排序,并且通过使用numbers的类方法来检索值--最终我们告诉它“对在numbers中的每一个键,使用它们在numbers中对应的值来比较并进行排序”。
我们也可以根据numbers的键对它的值进行排序,但是使用key参数会变得更复杂(没有一个字典方法可以返回一个键通过一个确定的值,如同list.index方法)。相反我们使用列表生成式来保持简单:
# Uses the first element of each tuple to compare
>>> [value for (key, value) in sorted(numbers.items())]
[4, 1, 2, 3]
# In order of sorted keys: ['Fourth', 'first', 'second', 'third']
另外一个需要考虑的参数就是reverse了。如果该值为True,最终的顺序将会逆转(降序),否则,如果它为False,这是默认值(升序),这很简单。例如,我们拿前面的两个排序来看:
>>> sorted(numbers, key=numbers.__getitem__, reverse=True)
['Fourth', 'third', 'second', 'first']
>>> [value for (key, value) in sorted(numbers.items(), reverse=True)]
[3, 2, 1, 4]
这些排序仍然很简单,那让我们看一些特别的算法,我们可能使用字符串或者数字来排序我们的字典。

使用String和Number算法来对Python字典排序

对字符串以字母表顺序排序是非常普通的,但是使用sorted可能没有对我们的字典中的键/值以正确的字母表顺序进行排序。例如,忽略大小写。为了忽略大小写,我们可以再次利用key参数以及str.lower(或者str.upper)方法,这样在比较时所有的字符串都有相同的case:
# We don't change the items to be returned, only while sorting
>>> sorted(numbers, key=str.lower)
['first', 'Fourth', 'second', 'third']


此文翻译自这里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: