常见python 排序
Python 内置排序方法
1. sorted()
函数
python
numbers = [64, 34, 25, 12, 22, 11, 90]# 返回新的排序后的列表,原列表不变 sorted_numbers = sorted(numbers) print("原列表:", numbers) # [64, 34, 25, 12, 22, 11, 90] print("排序后:", sorted_numbers) # [11, 12, 22, 25, 34, 64, 90]
2. list.sort()
方法
python
numbers = [64, 34, 25, 12, 22, 11, 90]# 原地排序,直接修改原列表 numbers.sort() print("排序后:", numbers) # [11, 12, 22, 25, 34, 64, 90]
3. 降序排序
python
numbers = [64, 34, 25, 12, 22, 11, 90]# 降序排序 sorted_desc = sorted(numbers, reverse=True) numbers.sort(reverse=True)print("降序:", sorted_desc) # [90, 64, 34, 25, 22, 12, 11]
从一个数组中找出前4个最大的数
def top_4_sorted(arr):"""使用排序方法找出前4个最大的数 使用内置函数(最简单)不高效"""# 降序排序后取前4个return sorted(arr, reverse=True)[:4]# 测试
numbers = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
result = top_4_sorted(numbers)
print(f"数组: {numbers}")
print(f"前4个最大的数: {result}")
4. 复杂排序
python
# 按字符串长度排序
words = ["apple", "hi", "banana", "a"]
sorted_words = sorted(words, key=len)
print("按长度排序:", sorted_words) # ['a', 'hi', 'apple', 'banana']
# 按自定义规则排序
students = [("Alice", 85), ("Bob", 92), ("Charlie", 78)]
sorted_students = sorted(students, key=lambda x: x[1], reverse=True)
print("按分数排序:", sorted_students) # [('Bob', 92), ('Alice', 85), ('Charlie', 78)]
1~9999数列中数字3出现的次数
暴力枚举:
def count_digit_3_brute_force(n):"""暴力枚举法统计1~n中数字3出现的次数"""count = 0for i in range(1, n + 1):# 将数字转为字符串,统计'3'出现的次数count += str(i).count('3')return count# 计算1~9999中数字3出现的次数
result = count_digit_3_brute_force(9999)
print(f"暴力枚举: 1~9999中数字3出现了 {result} 次")
迭代递推
def count_digit_3_iterative(n):"""迭代递推方法,最容易理解"""count = 0factor = 1 # 位数因子:1(个位), 10(十位), 100(百位)...while factor <= n:# 当前位的高位和低位higher = n // (factor * 10)lower = n % factorcurrent_digit = (n // factor) % 10# 根据当前位的值计算3的出现次数if current_digit < 3:count += higher * factorelif current_digit == 3:count += higher * factor + lower + 1else: # current_digit > 3count += (higher + 1) * factorfactor *= 10return count# 测试
result = count_digit_3_iterative(9999)
print(f"迭代递推: 1~9999中数字3出现了 {result} 次")
删除字符串a中包含的字符串b。
a = "asdw"
b = "sd"# 方法1:使用replace(推荐)
def remove_substring_simple(a, b):return a.replace(b, '')
删除字符串a中出现在字符串b里的所有字符
def remove_chars_loop(a, b):"""使用循环删除出现在b中的字符"""result = []for char in a:if char not in b:result.append(char)return ''.join(result)# 测试
a = "wbdc"
b = "wc"
result = remove_chars_loop(a, b)
print(f"'{a}' 删除出现在 '{b}' 中的字符 -> '{result}'")
python字符串和int类型的互相转换
num_str = "123"
num_int = int(num_str)num_int = 123
num_str = str(num_int)
格式化
1. % 格式化(传统方法)
# 基本用法
name = "Alice"
age = 25
print("姓名: %s, 年龄: %d" % (name, age)) # 姓名: Alice, 年龄: 25# 常用格式符
print("整数: %d" % 42) # 整数: 42
print("浮点数: %.2f" % 3.14159) # 浮点数: 3.14
print("字符串: %s" % "hello") # 字符串: hello
print("八进制: %o" % 10) # 八进制: 12
print("十六进制: %x" % 255) # 十六进制: ff# 宽度和对齐
print("右对齐: %10s" % "hello") # 右对齐: hello
print("左对齐: %-10s" % "hello") # 左对齐: hello
print("前导零: %05d" % 42) # 前导零: 00042
str.format() 方法(Python 2.6+)
# 基本用法
name = "Bob"
age = 30
print("姓名: {}, 年龄: {}".format(name, age)) # 姓名: Bob, 年龄: 30# 位置参数
print("{0} {1} {0}".format("hello", "world")) # hello world hello# 关键字参数
print("姓名: {name}, 年龄: {age}".format(name="Charlie", age=35))# 数字格式化
print("小数: {:.2f}".format(3.14159)) # 小数: 3.14
print("百分比: {:.1%}".format(0.85)) # 百分比: 85.0%
print("科学计数: {:.2e}".format(1234567)) # 科学计数: 1.23e+06# 对齐和填充
print("居中: {:^10}".format("hello")) # 居中: hello
print("右对齐: {:>10}".format("hello")) # 右对齐: hello
print("左对齐: {:<10}".format("hello")) # 左对齐: hello
print("填充: {:*^10}".format("hello")) # 填充: **hello***# 数字格式
print("千分位: {:,}".format(1234567)) # 千分位: 1,234,567
print("二进制: {:b}".format(10)) # 二进制: 1010
print("十六进制: {:x}".format(255)) # 十六进制: ff
3. f-string(Python 3.6+,推荐)
# 基本用法
name = "David"
age = 28
print(f"姓名: {name}, 年龄: {age}") # 姓名: David, 年龄: 28# 表达式计算
a, b = 5, 3
print(f"{a} + {b} = {a + b}") # 5 + 3 = 8
print(f"{a} * {b} = {a * b}") # 5 * 3 = 15# 方法调用
text = "hello world"
print(f"大写: {text.upper()}") # 大写: HELLO WORLD
print(f"长度: {len(text)}") # 长度: 11# 数字格式化
pi = 3.1415926
print(f"圆周率: {pi:.2f}") # 圆周率: 3.14
print(f"百分比: {0.85:.1%}") # 百分比: 85.0%
print(f"科学计数: {1234567:.2e}") # 科学计数: 1.23e+06# 对齐和填充
print(f"居中: {'hello':^10}") # 居中: hello
print(f"右对齐: {'hello':>10}") # 右对齐: hello
print(f"左对齐: {'hello':<10}") # 左对齐: hello
print(f"填充: {'hello':*^10}") # 填充: **hello***# 数字格式
number = 1234567
print(f"千分位: {number:,}") # 千分位: 1,234,567
print(f"二进制: {10:b}") # 二进制: 1010
print(f"十六进制: {255:x}") # 十六进制: ff# 日期格式化
from datetime import datetime
now = datetime.now()
给定一个数组nums,和一个目标值target, 找出数组中,和为target的那两个整数,返回他们的数组下标。
方法1:暴力枚举(最简单)
def two_sum_brute_force(nums, target):"""暴力枚举法时间复杂度: O(n²)空间复杂度: O(1)"""n = len(nums)for i in range(n):for j in range(i + 1, n):if nums[i] + nums[j] == target:return [i, j]return []# 测试
nums = [2, 7, 11, 15]
target = 9
result = two_sum_brute_force(nums, target)
print(f"nums = {nums}, target = {target}")
print(f"结果: {result}") # [0, 1]
有一个数组,有一个指定的目标值,获取这个目标值在这个数组中的下标
方法1:使用 index()
方法(最简单)
def find_index_simple(arr, target):"""使用index方法查找目标值的下标如果找不到会抛出ValueError"""try:return arr.index(target)except ValueError:return -1 # 返回-1表示未找到# 测试
arr = [10, 20, 30, 40, 50]
target = 30
result = find_index_simple(arr, target)
print(f"数组: {arr}")
print(f"目标值: {target}")
print(f"下标: {result}") # 2
方法2:遍历查找
def find_index_loop(arr, target):"""使用循环遍历查找"""for i, value in enumerate(arr):if value == target:return ireturn -1 # 未找到# 测试
arr = [10, 20, 30, 40, 50]
target = 40
result = find_index_loop(arr, target)
print(f"数组: {arr}")
print(f"目标值: {target}")
print(f"下标: {result}") # 3