如何根据字典的键或值来排序
2016-07-24 18:26
330 查看
在Python中的字典是一个非常有用的容器,可以存储一些值的集合,并且可以通过键来访问它。字典的值可以是任何对象类型(字典甚至可以嵌入另一个字典中),键可以为任何可hash的对象,也就是它不可以被改变(所以字符串并不是唯一合法的键,但是可变的比如列表就绝对不能作为键)。不想Python的列表或者元组,在dict对象中的键值对并没有特别的顺序,也就意味着我们可以有一个如下的字典:
尽管在实例化语句中键值对有特定的序列,但是通过调用list方法(也就是用它的键创建一个列表)我们可以很容易看到它并不是以实例化的顺序进行存储:
sorted函数的参数key(不要和字典的keys相混淆)允许,用我们定义指定的函数对items,作为一个iterator(在我们的dict对象中)进行排序。在上面的两个例子中,键和值都是我们用来排序并且比较的items,但是,如果我们想根据字典的值对字典的键进行排序,那么我们就要通过key参数告诉sorted。如下所示:
我们也可以根据numbers的键对它的值进行排序,但是使用key参数会变得更复杂(没有一个字典方法可以返回一个键通过一个确定的值,如同list.index方法)。相反我们使用列表生成式来保持简单:
此文翻译自这里
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']
此文翻译自这里
相关文章推荐
- awk 系列:如何使用 awk 的 ‘next’ 命令
- awk 系列:如何使用 awk 的 ‘next’ 命令
- 取出一个字符串中字母出现的次数。如:字符串:"abcde%^kka27qoq" ,输出格式为: a(2)b(1)k(2)...
- Android之基于位置的服务
- Android使用SeekBar时动态显示进度且随SeekBar一起移动
- 【 Codeforces 615A】A. Bulbs
- Hadoop Error: java.io.IOException: Unable to initialize any output collector
- HUST 1010 The Minimum Length (kmp求最小循环节)
- HDOJ 5747Aaronson
- 自学360之滚动的TextView
- Opencv图像识别从零到精通(15)-----阈值分割、固定阈值Threshold、自适应阈值分割adaptiveThreshold、OSTU大津法
- Android 自定义Seekbar
- 对linux下chown命令基本功能的实现
- hdu 5731 Solid Dominoes Tilings(多米诺骨牌)
- HDU 5747 Aaronson(汉明距离)
- 快速幂
- QRcode生成二维码
- java关于位移运算的面试题
- 二分查找法
- hdu5747 Aaronson 贪心