python sort()和sorted()函数
在本教程中,我们将学习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}]