dict(字典):是一种 数据结构,用于存储 键值对 的集合,它的核心作用是 存储和查找数据。map(映射函数):是一个 内置函数,用于对 可迭代对象(如列表)中的每个元素应用一个函数,并返回一个包含结果的迭代器,它的核心作用是 数据转换。
下面我们从多个维度进行详细的对比。
核心概念与用途
| 特性 | dict (字典) |
map (映射函数) |
|---|---|---|
| 本质 | 数据结构,一种内置的容器类型。 | 内置函数,一个工具函数。 |
| 用途 | 存储、管理和通过键快速查找数据。 | 对一个序列(或多个序列)中的每个元素执行一个指定的操作,生成一个新的序列。 |
| 形象比喻 | 一本字典或电话簿:通过“单词”(键)可以快速找到它的“解释”(值)。 | 一个工厂的流水线:把原材料(可迭代对象)放进去,经过一道工序(函数),出来的是成品(新的迭代器)。 |
语法与创建方式
dict (字典)
字典使用花括号 来创建,键值对用冒号 分隔。
# 1. 使用字面量创建
my_dict = {'name': 'Alice', 'age': 25, 'city': 'New York'}
print(my_dict)
# 输出: {'name': 'Alice', 'age': 25, 'city': 'New York'}
# 2. 使用 dict() 构造函数创建
empty_dict = {}
another_dict = dict(name='Bob', age=30, city='London') # 注意:这里键名不需要引号
print(another_dict)
# 输出: {'name': 'Bob', 'age': 30, 'city': 'London'}
# 3. 从一个包含键值对的可迭代对象(如元组列表)创建
pairs = [('key1', 'value1'), ('key2', 'value2')]
from_pairs = dict(pairs)
print(from_pairs)
# 输出: {'key1': 'value1', 'key2': 'value2'}
map (映射函数)
map() 函数的语法是 map(function, iterable, ...)。
function:一个函数对象,它将被应用到每个元素上。iterable:一个或多个可迭代对象(如列表、元组)。
map() 不直接创建列表,它返回的是一个 map 对象,这是一个迭代器,你需要用 list() 或其他方式来获取结果。
# 1. 使用 lambda 匿名函数
numbers = [1, 2, 3, 4, 5]
# 将列表中的每个数字平方
squared_map = map(lambda x: x**2, numbers)
# map 对象本身是惰性的,需要转换才能看到结果
print(squared_map)
# 输出: <map object at 0x...> (这是一个内存地址)
# 转换为列表
squared_list = list(squared_map)
print(squared_list)
# 输出: [1, 4, 9, 16, 25]
# 2. 使用已定义的函数
def add_one(n):
return n + 10
numbers = [5, 6, 7]
added_map = map(add_one, numbers)
added_list = list(added_map)
print(added_list)
# 输出: [15, 16, 17]
# 3. map 可以接受多个可迭代对象
# 将两个列表中对应位置的元素相加
list1 = [1, 2, 3]
list2 = [10, 20, 30]
summed_map = map(lambda x, y: x + y, list1, list2)
summed_list = list(summed_map)
print(summed_list)
# 输出: [11, 22, 33]
功能与操作
| 操作 | dict (字典) |
map (映射函数) |
|---|---|---|
| 访问元素 | my_dict['key'] 或 my_dict.get('key') |
不直接访问,需要遍历迭代器或转换为列表后通过索引访问。 |
| 修改/添加 | my_dict['new_key'] = 'new_value' |
不能修改。map 返回的是一个不可变的迭代器,要修改,需转换回列表。 |
| 删除元素 | del my_dict['key'] 或 my_dict.pop('key') |
不能删除,同上。 |
| 遍历 | for key in my_dict:for value in my_dict.values():for key, value in my_dict.items(): |
for item in my_map_object:或直接在 for 循环中使用 map 对象。 |
| 核心方法 | .keys(), .values(), .items(), .get(), .pop(), .update() 等。 |
无,它是一个函数,不是对象。 |
| 主要目的 | 数据存储与关联。 | 数据转换。 |
示例场景对比
假设我们有一份学生姓名和分数的列表,需要处理这些数据。
场景:数据存储与查找
# 使用 dict 来存储学生信息,便于通过姓名快速查找分数
student_scores = {
"Alice": 88,
"Bob": 92,
"Charlie": 79
}
# 查找 Alice 的分数
alice_score = student_scores["Alice"] # 非常快速,时间复杂度接近 O(1)
print(f"Alice's score is: {alice_score}")
# 添加新学生
student_scores["David"] = 85
print(f"Updated scores: {student_scores}")
在这个场景下,dict 是最佳选择,因为它提供了高效的键值对存储和查找。
场景:数据转换
# 使用 map 来将分数列表转换为评级列表
scores = [88, 92, 79, 85, 91]
def get_grade(score):
if score >= 90:
return 'A'
elif score >= 80:
return 'B'
elif score >= 70:
return 'C'
else:
return 'D'
# 使用 map 函数对每个分数应用 get_grade 函数
grades_map = map(get_grade, scores)
# 将 map 对象转换为列表
grades_list = list(grades_map)
print(f"The grades are: {grades_list}")
# 输出: The grades are: ['B', 'A', 'C', 'B', 'A']
在这个场景下,map 非常适合对一个集合中的所有元素执行统一的转换操作。
总结表格
| 特性 | dict (字典) |
map (映射函数) |
|---|---|---|
| 类型 | 数据结构 (容器) | 内置函数 |
| 目的 | 存储、查找、关联数据 | 转换、处理可迭代对象中的元素 |
| 创建 | , dict() |
map(func, iterable) |
| 返回值 | 字典对象 | map 迭代器对象 |
| 可变性 | 可变 | 返回的迭代器是惰性的,但最终结果通常是可变的(如列表) |
| 索引访问 | 支持 dict['key'] |
不直接支持,需转换后通过索引访问 |
| 核心思想 | 键值对映射 | 函数式编程中的映射 |
- 当你需要 存储数据,并且希望通过一个 唯一的标识(键) 来快速找到它时,使用
dict。 - 当你需要对一个 列表(或类似列表)中的所有数据 进行 同样的操作(比如计算、格式化、分类等)时,使用
map。
