基础算法之排序
为什么要开始这个章节
蓝桥杯捐款了,痛定思痛开始好好学算法,太丢脸了ww
跟着acwing的y神继续学!!!!!
加油加油www
排序的本质理解
- 快排:把两边切开分别排序,再切开递归,本质是分治
快速排序
代码
1 | def quick_sort(arr): # 定义快排的函数,输入为一个数组 |
一些python的用法更新
一些需要注意的用法
列表推导式
好的,这个问题非常关键!让我们深入理解列表推导式的语法,特别是为什么
for
前面有一个x
。列表推导式的基本结构
列表推导式的基本结构如下:
1
[expression for item in iterable if condition]
expression
:这是你希望每个元素变成的样子,或者说是处理每个元素的结果。通常这是你想要生成的结果。item
:这是迭代过程中的每个元素,代表你从iterable
中获取的元素。iterable
:这是你要遍历的对象,通常是一个列表、元组、字符串等。condition
(可选):这是一个过滤条件,只有满足这个条件的元素才会被包含在最终的列表中。
为什么第一个
for
前有一个x
?在你的代码中:
1
left = [x for x in arr if x < pivot]
- 第一个
x
是 表达式部分。它表示你希望列表推导式结果中的每个元素应该是什么。这里,x
代表你希望新列表中的每个元素直接是arr
中小于pivot
的元素。 for x in arr
是 迭代部分,表示你要遍历arr
中的每个元素,并将它们赋值给x
。if x < pivot
是 过滤条件部分,它表示你只想把那些小于pivot
的元素放入新列表left
。
解释
x for x in arr
部分for x in arr
表示遍历arr
数组中的每一个元素,并将当前的元素赋值给x
。这个x
是一个 占位符,代表当前的元素。- 在列表推导式中,
x
会出现在for
语句前,它表示生成的新列表中每一个元素的值。换句话说,x
是你要生成的新列表中的元素。
举个例子
假设
arr = [3, 6, 8, 10, 1, 2, 1]
,pivot = 6
。执行这行代码时:1
left = [x for x in arr if x < 6]
执行步骤:
x
会依次取arr
中的每个元素:x = 3
,满足3 < 6
,所以3
被加入到left
。x = 6
,不满足6 < 6
,所以6
不被加入。x = 8
,不满足8 < 6
,所以8
不被加入。x = 10
,不满足10 < 6
,所以10
不被加入。x = 1
,满足1 < 6
,所以1
被加入到left
。x = 2
,满足2 < 6
,所以2
被加入到left
。x = 1
,满足1 < 6
,所以1
被加入到left
。
最终,
left
变成了[3, 1, 2, 1]
。总结
第一个
x
代表了我们想要生成的新列表中的元素。它位于for
语句之前,因为它定义了列表推导式的“输出”,即新的列表中的元素是什么。而for x in arr
则是指定我们遍历arr
数组并从中选取元素x
。list()
函数Python 中的
list()
也是一个内置函数,用于将其他可迭代对象(如元组、字符串、字典等)转换为列表。join
是 Python 字符串类型的一个方法,用于将 可迭代对象(如列表、元组、集合等)中的元素连接成一个字符串,并且你可以指定一个 分隔符,这个分隔符会插入到每两个元素之间。join
方法的基本语法:1
separator.join(iterable)
separator
:指定连接符,即在每个元素之间插入的字符串。可以是任何字符串(例如空格、逗号、下划线等)。iterable
:这是你想要连接的可迭代对象(如列表、元组、集合等)。它的元素通常需要是字符串类型,或者可以通过str()
转换为字符串。
join
方法的工作原理:join
方法将遍历iterable
中的每个元素。- 然后,它会将元素连接成一个字符串,每个元素之间使用指定的
separator
作为分隔符。 - 最终返回一个新的连接后的字符串。
示例:
基本使用:
假设我们有一个字符串列表,想要将它们通过空格连接成一个字符串。1
2
3words = ["Hello", "world", "Python"]
result = " ".join(words)
print(result)输出:
1
Hello world Python
这里,
" "
是分隔符,它将列表中的元素用空格连接起来。使用其他分隔符:
你可以指定不同的分隔符,如逗号、下划线等。1
2
3words = ["apple", "banana", "cherry"]
result = ", ".join(words)
print(result)输出:
1
apple, banana, cherry
这里,
", "
是分隔符,元素之间用逗号加空格连接。没有分隔符:
如果你不想在元素之间添加任何分隔符,可以使用空字符串""
。1
2
3words = ["H", "e", "l", "l", "o"]
result = "".join(words)
print(result)输出:
1
Hello
这里,空字符串
""
作为分隔符,将列表中的元素直接连接成一个没有空格的字符串。连接数字(需要转换为字符串):
如果列表中的元素是非字符串类型(例如数字),你需要将它们转换为字符串类型。可以使用map(str, iterable)
来实现转换。1
2
3numbers = [1, 2, 3, 4]
result = "-".join(map(str, numbers))
print(result)输出:
1
1-2-3-4
这里,
map(str, numbers)
会将每个数字转换为字符串,然后再用"-"
连接它们。处理空列表:
如果列表是空的,join
方法会返回一个空字符串。1
2
3empty_list = []
result = " ".join(empty_list)
print(result) # 输出 ''
总结:
join
方法是将一个可迭代对象中的元素连接成一个字符串,元素之间用指定的分隔符连接。- 它的语法是:
separator.join(iterable)
,其中separator
是你希望使用的连接符。 join
适用于字符串类型的元素,若元素是其他类型(如数字),需要先将其转换为字符串。
这个方法非常高效,尤其是当你需要连接大量字符串时,它比直接使用
+
更高效。map 把字符串列表转换为整数
其他用法
map()
是 Python 中的一个内置函数,用于 将一个函数应用到可迭代对象(如列表、元组等)中的每个元素,并返回一个迭代器,包含了应用函数后的结果。map()
的基本语法:1
map(function, iterable, ...)
function
:一个函数,可以是内置的函数、lambda 表达式或用户定义的函数,表示你希望应用于每个元素的操作。iterable
:一个可迭代对象(如列表、元组、字符串等),map()
会将function
应用到其中的每个元素。- 如果有多个可迭代对象作为参数,
map()
会将它们一一配对,并将function
应用到对应元素的组合上。
map()
的工作流程:map()
会将传入的function
应用到iterable
中的每一个元素。- 它返回一个 迭代器,而不是直接返回一个列表(如果需要可以通过
list()
或tuple()
等转换为具体的类型)。 - 你可以使用
for
循环或list()
函数来遍历这个迭代器,获取每个元素的结果。
示例:
简单的例子:
假设我们有一个列表,想将其中的每个数字乘以 2。
1
2
3numbers = [1, 2, 3, 4, 5]
result = map(lambda x: x * 2, numbers)
print(list(result))输出:
1
[2, 4, 6, 8, 10]
- 这里,
lambda x: x * 2
是一个匿名函数,表示对每个元素执行x * 2
操作。 map()
会将这个操作应用到numbers
列表中的每个元素。- 由于
map()
返回的是一个迭代器,我们使用list()
将其转换为列表,并打印输出。
- 这里,
将字符串转换为数字:
如果你有一个包含数字字符串的列表,想将它们转换为整数:
1
2
3str_numbers = ["1", "2", "3", "4"]
result = map(int, str_numbers)
print(list(result))输出:
1
[1, 2, 3, 4]
- 这里,
int
是一个内置函数,它将每个字符串转换为整数。 map(int, str_numbers)
会把str_numbers
列表中的每个字符串应用int
函数,得到一个整数列表。
- 这里,
多个可迭代对象:
map()
也可以接受多个可迭代对象。如果传入多个可迭代对象,map()
会将它们的元素按位置进行配对,并将function
应用于每一组元素。例如:1
2
3
4numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
result = map(lambda x, y: x + y, numbers1, numbers2)
print(list(result))输出:
1
[5, 7, 9]
- 这里,
map()
会将numbers1
和numbers2
中对应位置的元素配对:(1, 4)
,(2, 5)
,(3, 6)
,然后对每一对元素应用lambda x, y: x + y
,即将它们相加。
- 这里,
map()
返回的是一个迭代器需要注意的是,
map()
返回的是一个 迭代器,不是一个列表。因此,在使用时,我们通常需要用list()
函数将其转换为列表,或者使用for
循环来遍历。例子总结:
应用函数到每个元素:
1
2
3numbers = [1, 2, 3]
result = map(lambda x: x * 2, numbers)
print(list(result)) # 输出 [2, 4, 6]将字符串转换为数字:
1
2
3str_numbers = ["10", "20", "30"]
result = map(int, str_numbers)
print(list(result)) # 输出 [10, 20, 30]多个可迭代对象:
1
2
3
4nums1 = [1, 2, 3]
nums2 = [4, 5, 6]
result = map(lambda x, y: x + y, nums1, nums2)
print(list(result)) # 输出 [5, 7, 9]
总结:
map()
是一个高效的函数式编程工具,能够将一个函数应用到多个元素上,并返回一个新的迭代器。- 它通常用于将某种操作应用于一个或多个可迭代对象的每个元素,像是转换数据类型、数学运算等。
- 返回值是一个迭代器,你可以使用
list()
、tuple()
或直接迭代它来获取结果。
希望这个解释能帮你理解
map()
的使用!