📜  Python sorted()

📅  最后修改于: 2020-09-20 04:33:35             🧑  作者: Mango

sorted() 函数从迭代器的项目中返回排序列表。

sorted() 函数以特定顺序( 升序降序 )对给定的Iterable的元素进行排序,并将排序后的Iterable作为列表返回。

sorted() 函数的语法为:

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

sorted() 函数的参数

sorted()最多可以使用三个参数:

  1. 可迭代-序列(字符串,元组,列表)或集合(集合,字典,冻结集合)或任何其他迭代器。
  2. 反向(可选)-如果为True ,则将排序列表反转(或以降序排序)。如果未提供,则默认为False
  3. 键(可选)-用作排序比较键的函数 。默认为None

示例1:对字符串,列表和元组进行排序

# vowels list
py_list = ['e', 'a', 'u', 'o', 'i']
print(sorted(py_list))

# string
py_string = 'Python'
print(sorted(py_string))

# vowels tuple
py_tuple = ('e', 'a', 'u', 'o', 'i')
print(sorted(py_tuple))

输出

['a', 'e', 'i', 'o', 'u']
['P', 'h', 'n', 'o', 't', 'y']
['a', 'e', 'i', 'o', 'u']

请注意,在所有情况下都会返回排序列表。

注意:列表还具有sort()方法,该方法的执行方式与sorted()相同。唯一的区别是sort()方法不返回任何值并更改原始列表。

示例2:按降序排序

sorted() 函数接受reverse参数作为可选参数。

设置reverse = True将可迭代对象按降序排序。

# set
py_set = {'e', 'a', 'u', 'o', 'i'}
print(sorted(py_set, reverse=True))

# dictionary
py_dict = {'e': 1, 'a': 2, 'u': 3, 'o': 4, 'i': 5}
print(sorted(py_dict, reverse=True))

# frozen set
frozen_set = frozenset(('e', 'a', 'u', 'o', 'i'))
print(sorted(frozen_set, reverse=True))

输出

['u', 'o', 'i', 'e', 'a']
['u', 'o', 'i', 'e', 'a']
['u', 'o', 'i', 'e', 'a']

Python sorted() 函数的关键参数

如果您想要自己的实现进行排序, sorted()还接受key 函数作为可选参数。

根据键函数的返回值,可以对给定的可迭代对象进行排序。

sorted(iterable, key=len)

在这里, len()是Python的内置函数,用于计算对象的长度。

该列表根据元素的长度(从最低计数到最高计数)进行排序。

示例3:使用具有键函数的 sorted()对列表进行排序

# take the second element for sort
def take_second(elem):
    return elem[1]


# random list
random = [(2, 2), (3, 4), (4, 1), (1, 3)]

# sort list with key
sorted_list = sorted(random, key=take_second)

# print list
print('Sorted list:', sorted_list)

输出

Sorted list: [(4, 1), (2, 2), (1, 3), (3, 4)]

示例4:使用多个键排序

让我们假设我们有以下列表:

# Nested list of student's info in a Science Olympiad
# List elements: (Student's Name, Marks out of 100, Age)

participant_list = [
    ('Alison', 50, 18),
    ('Terence', 75, 12),
    ('David', 75, 20),
    ('Jimmy', 90, 22),
    ('John', 45, 12)
]

我们希望对列表进行排序,以使分数最高的学生处于开头。如果学生获得相等的分数,则必须对他们进行排序,以便年轻的参与者优先。

通过返回元组而不是数字,我们可以使用多个键来实现这种排序。

可以通过比较两个元组的元素来比较两个元组。如果存在平局(元素相等),则比较第二个元素,依此类推。

>>> (1,3) > (1, 4)
False
>>> (1, 4) < (2,2)
True
>>> (1, 4, 1) < (2, 1)
True

让我们使用此逻辑来构建我们的排序逻辑。

# Nested list of student's info in a Science Olympiad
# List elements: (Student's Name, Marks out of 100 , Age)
participant_list = [
    ('Alison', 50, 18),
    ('Terence', 75, 12),
    ('David', 75, 20),
    ('Jimmy', 90, 22),
    ('John', 45, 12)
]


def sorter(item):
    # Since highest marks first, least error = most marks
    error = 100 - item[1]
    age = item[2]
    return (error, age)


sorted_list = sorted(participant_list, key=sorter)
print(sorted_list)

输出

[('Jimmy', 90, 22), ('Terence', 75, 12), ('David', 75, 20), ('Alison', 50, 18), ('John', 45, 12)]

由于排序逻辑函数很小,并且只适合一行,因此lambda 函数在key内部使用,而不是传递单独的函数名称。

可以使用lambda 函数以以下方式编写以上程序:

# Nested list of student's info in a Science Olympiad
# List elements: (Student's Name, Marks out of 100 , Age)
participant_list = [
    ('Alison', 50, 18),
    ('Terence', 75, 12),
    ('David', 75, 20),
    ('Jimmy', 90, 22),
    ('John', 45, 12)
]

sorted_list = sorted(participant_list, key=lambda item: (100-item[1], item[2]))
print(sorted_list)

输出

[('Jimmy', 90, 22), ('Terence', 75, 12), ('David', 75, 20), ('Alison', 50, 18), ('John', 45, 12)]

要了解有关lambda函数的更多信息,请访问Python Lambda函数。