python sort()和sorted()函数

时间:2020-02-23 14:43:20  来源:igfitidea点击:

在本教程中,我们将学习python sort()函数,该函数可用于对Python中的不同数据类型进行排序,例如列表,字典,元组等。

Python排序语法

我们可以在Python中使用不同的功能对不同的数据类型进行排序。

使用list.sort()

列表只有一种特殊的方法:

list.sort(*, key=None, reverse=False)

默认情况下,sort()执行A-Z样式的排序,左侧的值较低。
使用键允许使用添加功能来修改默认排序,而反向执行Z-A排序。

使用sorted()

另外,我们也可以使用内置的sorted()函数,语法如下:

sorted(iterable, *, key=None, reverse=False)

在此,key指定一个参数的功能,该参数用于从iterable中的每个元素中提取比较键。
反向是一个布尔值。
如果设置为True,则对列表元素进行排序,就好像每个比较都被反转一样。

Python排序列表

在本节中,我们将对Python List数据类型进行排序。

示例1:对字符串和整数使用sort.list()

我有一个示例脚本,其中一个列表包含字符串,另一个列表包含整数。

对于字符串,sort将按字母顺序排列项目,而对于整数则按数字顺序排列。
该脚本的输出:

~]# python3 sort-list.py
['Ford', 'Hyundai', 'Maruti']
[11, 12, 15, 16, 20]

示例2:将sort.list()与key配合使用

如果要进行其他排序,例如按每个列表项中的第二项排序,则可以将其作为参数传递给函数:

该脚本的输出:

~]# python3 sort-list.py
[[2, 34], [1, 43], [3, 56], [6, 98]]

在此示例中,我们可以看到排序不是按每个子列表中的第一项,而是按第二项,即现在是" 34-> 43-> 56-> 98",而不是" 1-" > 2-> 3-> 6`。

Python排序元组

我们可以使用sorted()对Python脚本中的任何元组进行排序:

#!/usr/bin/env python3
mytuple = ( 4, 5, 1, 3, 9)
mytuple_sorted = sorted(mytuple)
print(mytuple_sorted)

该脚本的输出:

~]# python3 sort-tuple.py
[1, 3, 4, 5, 9]

Python通过Key对字典进行排序

在本节中,将介绍可用于按KEY对python字典项进行排序的不同方法。
我们将通过sorted()来研究key功能的更复杂用法。

示例1:在dict()中对lambda使用sorted()

Python 3.6及更高版本支持此方法。
我定义了带有一些键值对的字典。
我们将使用sorted()函数通过键对字典的内容进行排序:

#!/usr/bin/env python3
mydict = {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
print('Without sort: ', mydict)
sorted_mydict = dict(sorted(mydict.items(), key=lambda item: item[0]))
print('After sort: ', sorted_mydict)
print(type(sorted_mydict))

这里的" item [0]"代表字典的键,该脚本的输出:

~]# python3 sort-dictionary.py
Without sort:  {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
After sort:  {'key1': 'val5', 'key2': 'val3', 'key3': 'val2'}
<class 'dict'>

示例2:对字典项使用sorted()

我们将使用与之前相同的方法,但由于标准Python字典是无序的,因此将使用convert字典转换为OrderedDict
即使对((key,value))对进行了排序,也无法以保留顺序的方式将它们存储在dict中。

#!/usr/bin/env python3
from collections import OrderedDict
mydict = {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
print('Without sort: ', mydict)
## Using dict() with items
sorted_mydict = dict(sorted(mydict.items()))
print('After sort: ', sorted_mydict)
print(type(sorted_mydict))
## Using dict() with items, sorted in reverse order
sorted_mydict = dict(sorted(mydict.items(), reverse=True))
print('After sort(reverse): ', sorted_mydict)
print(type(sorted_mydict))
## Using OrderedDict()
sorted_mydict = OrderedDict(sorted(mydict.items()))
print('After sort: ', sorted_mydict)
print(type(sorted_mydict))
## Using OrderedDict(), sorted in reverse order
sorted_mydict = OrderedDict(sorted(mydict.items(), reverse=True))
print('After sort (reverse): ', sorted_mydict)
print(type(sorted_mydict))

该脚本的输出:

~]# python3 sort-dictionary.py
Without sort:  {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
After sort:  {'key1': 'val5', 'key2': 'val3', 'key3': 'val2'}
<class 'dict'>
After sort(reverse):  {'key3': 'val2', 'key2': 'val3', 'key1': 'val5'}
<class 'dict'>
After sort:  OrderedDict([('key1', 'val5'), ('key2', 'val3'), ('key3', 'val2')])
<class 'collections.OrderedDict'>
After sort (reverse):  OrderedDict([('key3', 'val2'), ('key2', 'val3'), ('key1', 'val5')])
<class 'collections.OrderedDict'>

我在" Example-2"中介绍了4种不同的情况:

  • 使用sorted()对字典进行排序,并使用dict()将其转换回无序字典

  • 对无序字典使用reverse = True反转排序顺序

  • 用sorted()对字典排序,并将新变量转换为OrderedDict()。

  • OrderedDict()使用reverse = True反转排序顺序

示例3:将sorted()与lambda和OrderedDict一起使用

在这个例子中,我们可以再次使用dict或者OrderedDict来根据key对Python字典进行排序:

#!/usr/bin/env python3
from collections import OrderedDict
mydict = {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
print('Without sort: ', mydict)
sorted_mydict = OrderedDict(sorted(mydict.items(), key=lambda item: item[0]))
print('After sort: ', sorted_mydict)
print(type(sorted_mydict))

该脚本的输出:

~]# python3 sort-dictionary.py
Without sort:  {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
After sort:  OrderedDict([('key1', 'val5'), ('key2', 'val3'), ('key3', 'val2')])
<class 'collections.OrderedDict'>

示例4:使用for循环遍历字典

我们可以使用sorted()对字典键进行排序,并使用for循环遍历各个键:

#!/usr/bin/env python3
mydict = {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
for key in sorted(mydict.keys()):
    print(key, mydict[key])

该脚本的输出:

~]# python3 sort-dictionary.py
key1 val5
key2 val3
key3 val2

示例5:将sorted()与itemgetter一起使用

我们还可以使用运算符模块中的" itemgetter"来返回可调用对象,该对象使用操作数的__getitem __()方法从其操作数中提取项目。
在这种情况下," itemgetter [0]"将返回字典的键。

#!/usr/bin/env python3
from collections import OrderedDict
from operator import itemgetter
mydict = {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
print('Without sort: ', mydict)
sorted_mydict = dict(sorted(mydict.items(), key=itemgetter(0)))
print('After sort: ', sorted_mydict)
print(type(sorted_mydict))
sorted_mydict = OrderedDict(sorted(mydict.items(), key=itemgetter(0)))
print('After sort: ', sorted_mydict)
print(type(sorted_mydict))

该脚本的输出:

~]# python3 sort-dictionary.py
Without sort:  {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
After sort:  {'key1': 'val5', 'key2': 'val3', 'key3': 'val2'}
<class 'dict'>
After sort:  OrderedDict([('key1', 'val5'), ('key2', 'val3'), ('key3', 'val2')])
<class 'collections.OrderedDict'>

我们已经将itemgetter与dict()和OrderedDict()一起使用了

Python按值对字典排序

在本节中,我们将学习可用于基于值对字典项进行排序的不同方法。

示例1:将sorted()与lambda一起使用

Python 3.6及更高版本支持此方法。
在使用键执行字典排序时,我们使用了相同的方法,这里我们将item [0]更改为item [1]以按值执行排序:

#!/usr/bin/env python3
mydict = {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
print('Without sort: ', mydict)
sorted_mydict = dict(sorted(mydict.items(), key=lambda item: item[1]))
print('After sort: ', sorted_mydict)
print(type(sorted_mydict))

该脚本的输出:

~]# python3 sort-dictionary.py
Without sort:  {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
After sort:  {'key3': 'val2', 'key2': 'val3', 'key1': 'val5'}
<class 'dict'>

我们现在可以检查值是否为排序格式。

示例2:对sorted()和lambda使用for循环

我们可以遍历Example-1代码以按排序顺序获取值,也可以获取两个键值对。

#!/usr/bin/env python3
mydict = {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
print('Without sort: ', mydict)
for key, value in sorted(mydict.items(), key=lambda item: item[1]):
    print(key + ':' + value)

脚本的输出按排序顺序显示值:

~]# python3 sort-dictionary.py
Without sort:  {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
key3:val2
key2:val3
key1:val5

示例3:在sorted()中使用for循环

我们还可以使用简单的for循环来迭代字典的值,此外,我们将添加sorted()对值进行排序:

#!/usr/bin/env python3
mydict = {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
for item in sorted(mydict.values()):
    print(item)

该脚本的输出:

~]# python3 sort-dictionary.py
val2
val3
val5

示例4:将sorted()与itemgetter一起使用

我们已经通过使用item [0] (即索引位置" 0")对关键字的字典进行排序时使用了" itemgetter",现在我们可以使用相同的代码,但索引位置为" 1"(即`item [1])来访问字典的值:

#!/usr/bin/env python3
from collections import OrderedDict
from operator import itemgetter
mydict = {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
print('Without sort: ', mydict)
sorted_mydict = dict(sorted(mydict.items(), key=itemgetter(1)))
print('After sort: ', sorted_mydict)
print(type(sorted_mydict))
sorted_mydict = OrderedDict(sorted(mydict.items(), key=itemgetter(1)))
print('After sort: ', sorted_mydict)
print(type(sorted_mydict))

该脚本的输出:

~]# python3 sort-dictionary.py
Without sort:  {'key1': 'val5', 'key3': 'val2', 'key2': 'val3'}
After sort:  {'key3': 'val2', 'key2': 'val3', 'key1': 'val5'}
<class 'dict'>
After sort:  OrderedDict([('key3', 'val2'), ('key2', 'val3'), ('key1', 'val5')])
<class 'collections.OrderedDict'>

Python字典排序列表

在本节中,我们将基于该值对包含字典的列表进行排序。

示例1:将lambda与sorted()一起使用

为了支持该用例,sorted方法接受了预期为功能的key参数。

该键函数传递了一个参数,该参数是要排序的列表中的一项。
键功能的返回值应该是可比较的值(即具有自然顺序),以代替用于排序目的的项。

其中我使用lambda关键字为关键参数定义一个函数,该函数使我能够按工具对象的价格和价格对列表进行数字排序:

#!/usr/bin/env python3
cars = [
        {'Model': 'Creta', 'Make': 2007, 'Price': 1500000},
        {'Model': 'Jazz', 'Make': 2010, 'Price': 3000000},
        {'Model': 'Ecosport', 'Make': 2009, 'Price': 2000000},
        {'Model': 'Brezza', 'Make': 20012, 'Price': 2500000},
    ]
## sort based on Price value
cars_sorted_Price = sorted(cars, key=lambda item:item['Price'])
print(cars_sorted_Price)
## sort based on Make value
cars_sorted_Make = sorted(cars, key=lambda item:item['Make'])
print(cars_sorted_Make)

该脚本的输出:

~]# python3 sort-dictionary.py
[{'Model': 'Creta', 'Make': 2007, 'Price': 1500000}, {'Model': 'Ecosport', 'Make': 2009, 'Price': 2000000}, {'Model': 'Brezza', 'Make': 20012, 'Price': 2500000}, {'Model': 'Jazz', 'Make': 2010, 'Price': 3000000}]
[{'Model': 'Creta', 'Make': 2007, 'Price': 1500000}, {'Model': 'Ecosport', 'Make': 2009, 'Price': 2000000}, {'Model': 'Jazz', 'Make': 2010, 'Price': 3000000}, {'Model': 'Brezza', 'Make': 20012, 'Price': 2500000}]

示例2:将lambda与get()结合使用

在此示例中,我们将通过get()方法使用python lambda。

#!/usr/bin/env python3
cars = [
        {'Model': 'Creta', 'Make': 2007, 'Price': 1500000},
        {'Model': 'Jazz', 'Make': 2010, 'Price': 3000000},
        {'Model': 'Ecosport', 'Make': 2009, 'Price': 2000000},
        {'Model': 'Brezza', 'Make': 20012, 'Price': 2500000},
    ]
## sort based on Price value
cars_sorted_Price = sorted(cars, key=lambda item: item.get('Price'))
print(cars_sorted_Price, end='\n\n')
## sort based on Make value
cars_sorted_Make = sorted(cars, key=lambda item: item.get('Make'))
print(cars_sorted_Make)

该脚本的输出:

~]# python3 sort-dictionary.py
[{'Model': 'Creta', 'Make': 2007, 'Price': 1500000}, {'Model': 'Ecosport', 'Make': 2009, 'Price': 2000000}, {'Model': 'Brezza', 'Make': 20012, 'Price': 2500000}, {'Model': 'Jazz', 'Make': 2010, 'Price': 3000000}]
[{'Model': 'Creta', 'Make': 2007, 'Price': 1500000}, {'Model': 'Ecosport', 'Make': 2009, 'Price': 2000000}, {'Model': 'Jazz', 'Make': 2010, 'Price': 3000000}, {'Model': 'Brezza', 'Make': 20012, 'Price': 2500000}]

示例3:将sorted()与itemgetter()结合使用

我们将使用itemgetter()以及必须对字典列表进行排序的键名。

#!/usr/bin/env python3
from operator import itemgetter
cars = [
        {'Model': 'Creta', 'Make': 2007, 'Price': 1500000},
        {'Model': 'Jazz', 'Make': 2010, 'Price': 3000000},
        {'Model': 'Ecosport', 'Make': 2009, 'Price': 2000000},
        {'Model': 'Brezza', 'Make': 20012, 'Price': 2500000},
    ]
## sort based on Price value
cars_sorted_Price = sorted(cars, key=itemgetter('Price'))
print(cars_sorted_Price, end='\n\n')
## sort based on Make value
cars_sorted_Make = sorted(cars, key=itemgetter('Make'))
print(cars_sorted_Make)

该脚本的输出:

~]# python3 sort-dictionary.py
[{'Model': 'Creta', 'Make': 2007, 'Price': 1500000}, {'Model': 'Ecosport', 'Make': 2009, 'Price': 2000000}, {'Model': 'Brezza', 'Make': 20012, 'Price': 2500000}, {'Model': 'Jazz', 'Make': 2010, 'Price': 3000000}]
[{'Model': 'Creta', 'Make': 2007, 'Price': 1500000}, {'Model': 'Ecosport', 'Make': 2009, 'Price': 2000000}, {'Model': 'Jazz', 'Make': 2010, 'Price': 3000000}, {'Model': 'Brezza', 'Make': 20012, 'Price': 2500000}]