一个认为一切根源都是“自己不够强”的INTJ
个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数
Python-3.12.0文档解读
目录
详细说明
map(function, iterable, *iterables)
参数
返回值
示例
注意事项
参考
记忆策略
字面含义联想:
使用场景联想:
常用场景
1. 将列表中的每个数字平方
详细说明:
2. 将字符串列表中的每个字符串转换为大写
详细说明:
3. 将两个列表中的对应元素相加
详细说明:
4. 使用现有函数将列表中的每个数字转换为字符串
详细说明:
5. 处理字典列表,提取特定键的值
详细说明:
巧妙用法
1. 处理嵌套列表
示例:对嵌套列表的每个元素取平方
2. 使用 map 和 str.join 连接字符串列表
示例:将多个字符串列表连接成一个字符串
3. 使用 map 结合 itertools.cycle 实现循环操作
示例:将数字列表循环3次
4. 使用 map 结合 itertools.starmap 进行多参数函数调用
示例:对两个数字列表进行元素间的乘法运算
5. 组合 map 和 filter 进行复杂的数据操作
示例:过滤出偶数并将其平方
综合技巧
1. 使用 map 和 itertools.chain 展平嵌套列表
示例:展平嵌套列表
2. 使用 map 和 itertools.groupby 分组并处理数据
示例:按偶数和奇数分组并计算每组的平方和
3. 使用 map 和 collections.Counter 统计词频并格式化输出
示例:统计单词频率并格式化为字符串
4. 使用 map 和 functools.reduce 实现复杂的累积操作
示例:将列表中的数字平方后累加
5. 使用 map 和 filter 结合生成复杂的数据处理流水线
示例:过滤出大于10的数字并计算其平方根
详细说明
map(function, iterable, *iterables)
map 函数用于将指定的函数 function 应用于给定的可迭代对象 iterable 的每一个元素,并返回一个包含结果的迭代器。如果提供了额外的可迭代对象 *iterables,则 function 必须接受相同数量的参数,并且会并行地从所有可迭代对象中获取元素,依次将这些元素作为参数传递给 function。
参数
- function: 一个函数,该函数将被应用于每个可迭代对象的元素。这个函数可以接收一个或多个参数,具体取决于传递给 map 函数的可迭代对象的数量。
- iterable: 一个可迭代对象,包含要处理的元素(例如列表、元组或字符串)。
- *iterables: 可选的其他可迭代对象。如果提供多个可迭代对象,function 将并行地从这些可迭代对象中取出元素并将其传递给 function 进行处理。
返回值
map 函数返回一个迭代器,该迭代器生成 function 应用于每个输入元素后的结果。如果有多个可迭代对象,迭代器将在最短的可迭代对象耗尽时停止。
示例
- 只有一个可迭代对象的情况:
# 示例:将一个列表中的每个元素平方
numbers = [1, 2, 3, 4, 5]
squared = map(lambda x: x**2, numbers)
print(list(squared)) # 输出: [1, 4, 9, 16, 25]
- 多个可迭代对象的情况:
# 示例:将两个列表中的对应元素相加
numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
summed = map(lambda x, y: x + y, numbers1, numbers2)
print(list(summed)) # 输出: [5, 7, 9]
- 使用不同长度的可迭代对象:
# 示例:当一个可迭代对象比另一个短时
numbers1 = [1, 2, 3]
numbers2 = [4, 5]
summed = map(lambda x, y: x + y, numbers1, numbers2)
print(list(summed)) # 输出: [5, 7],迭代在较短的可迭代对象耗尽时停止
注意事项
- map 函数返回的是一个迭代器,而不是列表。如果需要获得列表,可以使用 list() 函数将结果转换为列表。
- 当有多个可迭代对象时,function 的参数数量必须与可迭代对象的数量相同。
- 如果需要将一个接受元组作为参数的函数应用于可迭代对象,可以使用 itertools.starmap() 函数。
参考
对于需要将元组作为参数传递给函数的情况,您可以参考 itertools.starmap() 函数。itertools.starmap() 是 map 的变体,适用于函数的输入参数已经被打包成元组的情况。
记忆策略
字面含义联想:
map 这个单词在英语中有“映射”的意思。将这个意思联想为“将一个函数映射到可迭代对象的每一个元素上”,这正是 map 函数的作用。
使用场景联想:
想象在编程中需要对列表中的每个元素进行某种操作,比如将每个数平方、将每个字符串转换为大写等。此时你需要一个工具来逐个处理这些元素,而这个工具就是 map 函数。
常用场景
好的,以下是 map 函数的几个常用且实用的使用场景,每个示例都附有详细的注释说明:
1. 将列表中的每个数字平方
# 示例列表
numbers = [1, 2, 3, 4, 5]
# 使用 map 函数将每个数字平方
squared = map(lambda x: x**2, numbers)
# 将 map 对象转换为列表以便查看结果
squared_list = list(squared)
# 打印结果
print(squared_list) # 输出: [1, 4, 9, 16, 25]
详细说明:
- 定义一个包含数字的列表 numbers。
- 使用 map 函数和匿名函数 lambda 将每个数字平方。
- 将 map 对象转换为列表 squared_list,以便打印和查看结果。
2. 将字符串列表中的每个字符串转换为大写
# 示例字符串列表
strings = ["hello", "world", "python"]
# 使用 map 函数将每个字符串转换为大写
uppercased = map(str.upper, strings)
# 将 map 对象转换为列表以便查看结果
uppercased_list = list(uppercased)
# 打印结果
print(uppercased_list) # 输出: ['HELLO', 'WORLD', 'PYTHON']
详细说明:
- 定义一个包含字符串的列表 strings。
- 使用 map 函数和字符串方法 str.upper 将每个字符串转换为大写。
- 将 map 对象转换为列表 uppercased_list,以便打印和查看结果。
3. 将两个列表中的对应元素相加
# 示例列表
numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
# 使用 map 函数将两个列表中的对应元素相加
summed = map(lambda x, y: x + y, numbers1, numbers2)
# 将 map 对象转换为列表以便查看结果
summed_list = list(summed)
# 打印结果
print(summed_list) # 输出: [5, 7, 9]
详细说明:
- 定义两个包含数字的列表 numbers1 和 numbers2。
- 使用 map 函数和匿名函数 lambda 将两个列表中的对应元素相加。
- 将 map 对象转换为列表 summed_list,以便打印和查看结果。
4. 使用现有函数将列表中的每个数字转换为字符串
# 示例列表
numbers = [1, 2, 3, 4, 5]
# 使用 map 函数和内置函数 str 将每个数字转换为字符串
str_numbers = map(str, numbers)
# 将 map 对象转换为列表以便查看结果
str_numbers_list = list(str_numbers)
# 打印结果
print(str_numbers_list) # 输出: ['1', '2', '3', '4', '5']
详细说明:
- 定义一个包含数字的列表 numbers。
- 使用 map 函数和内置函数 str 将每个数字转换为字符串。
- 将 map 对象转换为列表 str_numbers_list,以便打印和查看结果。
5. 处理字典列表,提取特定键的值
# 示例字典列表
students = [
{"name": "Alice", "age": 24},
{"name": "Bob", "age": 22},
{"name": "Charlie", "age": 23}
]
# 使用 map 函数提取每个字典中的 "name" 键的值
names = map(lambda student: student["name"], students)
# 将 map 对象转换为列表以便查看结果
names_list = list(names)
# 打印结果
print(names_list) # 输出: ['Alice', 'Bob', 'Charlie']
详细说明:
- 定义一个包含学生信息的字典列表 students。
- 使用 map 函数和匿名函数 lambda 提取每个字典中的 "name" 键的值。
- 将 map 对象转换为列表 names_list,以便打印和查看结果。
这些示例展示了 map 函数在不同场景中的强大和灵活性。通过这些详细的示例和注释,可以更好地理解和记住 map 函数的用法。
巧妙用法
1. 处理嵌套列表
使用 map 函数对嵌套列表进行操作,可以避免使用嵌套的循环。例如,我们可以用 map 函数对多维列表中的每个元素进行操作。
示例:对嵌套列表的每个元素取平方
# 示例嵌套列表
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 使用 map 函数对嵌套列表的每个元素平方
squared_nested_list = map(lambda sublist: list(map(lambda x: x**2, sublist)), nested_list)
# 将结果转换为列表以便查看
result = list(squared_nested_list)
# 打印结果
print(result) # 输出: [[1, 4, 9], [16, 25, 36], [49, 64, 81]]
2. 使用 map 和 str.join 连接字符串列表
通过结合 map 和 str.join,可以对字符串列表进行高效连接操作,避免使用显式的循环。
示例:将多个字符串列表连接成一个字符串
# 示例字符串列表
words_list = [["Hello", "world"], ["Python", "is", "awesome"], ["Map", "function"]]
# 使用 map 和 str.join 将每个字符串列表连接成一个字符串
joined_strings = map(" ".join, words_list)
# 将结果转换为列表以便查看
result = list(joined_strings)
# 打印结果
print(result) # 输出: ['Hello world', 'Python is awesome', 'Map function']
3. 使用 map 结合 itertools.cycle 实现循环操作
使用 map 和 itertools.cycle 可以对一个列表进行循环操作,直到达到指定次数。
示例:将数字列表循环3次
import itertools
# 示例数字列表
numbers = [1, 2, 3]
# 使用 map 和 itertools.cycle 实现循环操作
cycled_numbers = map(lambda x: x, itertools.cycle(numbers))
# 将结果转换为列表并切片以便只取前9个元素
result = list(itertools.islice(cycled_numbers, 9))
# 打印结果
print(result) # 输出: [1, 2, 3, 1, 2, 3, 1, 2, 3]
4. 使用 map 结合 itertools.starmap 进行多参数函数调用
在某些情况下,我们需要对多个参数的函数进行映射操作,这时可以结合 map 和 itertools.starmap 使用。
示例:对两个数字列表进行元素间的乘法运算
import itertools
# 示例数字列表
numbers1 = [1, 2, 3]
numbers2 = [4, 5, 6]
# 使用 zip 将两个列表打包成元组的迭代器
zipped_lists = zip(numbers1, numbers2)
# 使用 itertools.starmap 对打包后的元组进行多参数函数调用
multiplied = itertools.starmap(lambda x, y: x * y, zipped_lists)
# 将结果转换为列表以便查看
result = list(multiplied)
# 打印结果
print(result) # 输出: [4, 10, 18]
5. 组合 map 和 filter 进行复杂的数据操作
我们可以将 map 和 filter 结合起来,先进行过滤操作,再进行映射操作,或者反之。
示例:过滤出偶数并将其平方
# 示例数字列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 先过滤出偶数,再将其平方
filtered_and_squared = map(lambda x: x**2, filter(lambda x: x % 2 == 0, numbers))
# 将结果转换为列表以便查看
result = list(filtered_and_squared)
# 打印结果
print(result) # 输出: [4, 16, 36, 64, 100]
这些技巧展示了 map 函数在更加高级和复杂的场景中的应用,充分发挥了 Python 函数式编程的灵活性和强大功能。通过这些技巧,可以更高效地处理数据并简化代码逻辑。
综合技巧
组合使用 map 函数与其他函数或方法可以创造一些非常巧妙的用法,下面列出几个结合使用 map 和其他函数的高级技巧,每个示例都包含详细注释:
1. 使用 map 和 itertools.chain 展平嵌套列表
itertools.chain 可以将多个可迭代对象串联起来,结合 map 可以用于展平嵌套列表。
示例:展平嵌套列表
import itertools
# 示例嵌套列表
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
# 使用 map 和 itertools.chain 将嵌套列表展平
flattened = itertools.chain.from_iterable(map(lambda x: x, nested_list))
# 将结果转换为列表以便查看
result = list(flattened)
# 打印结果
print(result) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9]
2. 使用 map 和 itertools.groupby 分组并处理数据
itertools.groupby 可以对数据进行分组,结合 map 可以对每个分组进行处理。
示例:按偶数和奇数分组并计算每组的平方和
import itertools
# 示例数字列表
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 排序以确保 groupby 正常工作
numbers.sort(key=lambda x: x % 2)
# 使用 itertools.groupby 进行分组
grouped = itertools.groupby(numbers, key=lambda x: x % 2)
# 计算每组的平方和
squared_sums = map(lambda group: sum(map(lambda x: x**2, group[1])), grouped)
# 将结果转换为列表以便查看
result = list(squared_sums)
# 打印结果
print(result) # 输出: [165, 120]
3. 使用 map 和 collections.Counter 统计词频并格式化输出
collections.Counter 可以轻松统计词频,结合 map 可以格式化输出结果。
示例:统计单词频率并格式化为字符串
from collections import Counter
# 示例字符串
text = "hello world hello python hello code"
# 使用 Counter 统计单词频率
word_counts = Counter(text.split())
# 使用 map 格式化输出
formatted_counts = map(lambda item: f"{item[0]}: {item[1]}", word_counts.items())
# 将结果转换为列表以便查看
result = list(formatted_counts)
# 打印结果
print(result) # 输出: ['hello: 3', 'world: 1', 'python: 1', 'code: 1']
4. 使用 map 和 functools.reduce 实现复杂的累积操作
functools.reduce 可以用于累积操作,结合 map 可以实现更复杂的数据处理流程。
示例:将列表中的数字平方后累加
from functools import reduce
# 示例数字列表
numbers = [1, 2, 3, 4, 5]
# 使用 map 将每个数字平方
squared_numbers = map(lambda x: x**2, numbers)
# 使用 reduce 将平方后的数字累加
sum_of_squares = reduce(lambda x, y: x + y, squared_numbers)
# 打印结果
print(sum_of_squares) # 输出: 55
5. 使用 map 和 filter 结合生成复杂的数据处理流水线
通过结合 map 和 filter,可以创建一个数据处理流水线,先过滤数据,再进行映射操作。
示例:过滤出大于10的数字并计算其平方根
import math
# 示例数字列表
numbers = [4, 16, 25, 1, 9, 36, 49]
# 使用 filter 过滤出大于10的数字
filtered_numbers = filter(lambda x: x > 10, numbers)
# 使用 map 计算每个剩余数字的平方根
square_roots = map(math.sqrt, filtered_numbers)
# 将结果转换为列表以便查看
result = list(square_roots)
# 打印结果
print(result) # 输出: [4.0, 5.0, 6.0, 7.0]
这些示例展示了如何结合使用 map 函数与其他强大的 Python 库和函数来实现巧妙的数据处理和操作。通过这些技巧,可以创建更高效、更简洁的代码,同时也能更好地理解函数式编程的优势。
感谢阅读。