dict
在python中,已经为我们内置了字典dict(即dictionary),字典的存储特征是它使用键-值(key-value)存储,具有极快的查找速度
例如要进行成绩查找,如果我们使用前文中说到的list,则需要写成
names = ['Andy', 'Udon', 'Deemoe']
socre = ['100', '105', '98']
在这个list中,当要查询一个成绩,需要根据名字定位到位置,然后再查找对应的分数,而这样明显效率相当低下
但是如果我们使用dict
>>> d = {'Andy':100, 'Udon':105, 'Deemoe':98}
>>> d['Udon']
105
通过这种一一对应的方式,我们可以实现较高效的查找
我们还可以给一个字典后进行赋值
>>> d['Bob']=66
>>> d['Bob']
66
而后赋值的对象的值会冲掉前面的值
如果dict中不存在对应的值将会报错
而检测dict中是否存在对应的值,我们可以用两种方法
-
使用
in
来进行判断>>> 'Anker' in d False
-
使用
get()
函数来进行判断>>> d.get('Anker')
需要注意的是在交互环境下
get()
函数返回的none不显示
而如果想要删除dict中的一个key,我们使用pop()
,对应的value也会被一并删除
>>> d.pop('Bob')
66
>>> d
{'Andy': 100, 'Udon': 105, 'Deemoe': 98}
dict是一种用空间换时间的方式,用大量内存的占用来换取几块的检索速度
同时我们仍然需要注意dict中的key是不可变的,否则将会造成检索对应的错误
set
set与dict类似,也是一组key的集合,但它并不存储value,同时,在set中key仍然不能重复
>>> s = {1, 2, 3}
>>> s
{1, 2, 3}
或者提供一个list作为集合
>>> s = set([1,2,3])
>>> s
{1, 2, 3}
通过add()
可以在一个set中添加key
>>> s
{1, 2, 3}
>>> s.add(4)
>>> s
{1, 2, 3, 4}
而在一个set中重复的内容会自动被过滤,所以重复添加某一个元素是没用的
通过remove()
可以在一个set中删除key
>>> s
{1, 2, 3, 4}
>>> s.remove(4)
>>> s
{1, 2, 3}
set可以看作数学上无序无重复集合,因为我们可以将其进行交集等操作
>>> s = {1,2,3}
>>> t = {2,3,4}
>>> s & t
{2, 3}
>>> s | t
{1, 2, 3, 4}
可变与不可变对象
在python中,list是可变对象,str是不可变对象
>>> a = ['c','b','a']
>>> a.sort()
>>> a
['a', 'b', 'c']
我们使用sort对['c','b','a']
的列表进行排序,修改了原列表的内容
而对于str
>>> a = 'abc'
>>> a.replace('a','A')
'Abc'
>>> a
'abc'
可以看到,我们虽然使用replace()
将a用A替换掉,但是在最后要求输出str内容时候仍然是abc
的内容
在过去几篇文章中写到了list
,tuple
,dict
和set
四种常见的数据类型,现在把它们纵向放一起进行对比
1. 数据类型对比
数据类型 | 是否可变(Mutable) | 是否允许重复元素 | 是否有序(Ordered) | 是否支持索引(Indexing) | 是否可作为字典的键(Hashable) |
---|---|---|---|---|---|
list | ✅ 可变 | ✅ 允许 | ✅ 有序 | ✅ 支持索引 | ❌ 不能作为键 |
tuple | ❌ 不可变 | ✅ 允许 | ✅ 有序 | ✅ 支持索引 | ✅ 可以作为键 |
dict | ✅ 可变 | ❌ 键不允许重复 | ✅ 有序 (Python 3.7+) | ✅ 支持键访问 | ❌ 不能作为键 |
set | ✅ 可变 | ❌ 不允许重复 | ❌ 无序 | ❌ 不支持索引 | ❌ 不能作为键 |
Python 3.7+ 之后,dict 的键值对顺序 保持插入顺序,在此之前是无序的。
2. list(列表)
特点:
• 可变,可以动态增删改元素。
• 允许重复元素,可以存储相同的值。
• 有序,保持插入顺序,支持索引操作。
适用场景:
• 需要 存储多个元素,且可能要修改数据(增删改)。
• 适用于 动态数据集合,比如:
• 记录学生成绩:scores = [90, 85, 78, 92]
• 存储任务队列:tasks = ["task1", "task2", "task3"]
• 作为可变的动态数组:shopping_list.append("milk")
示例代码:
fruits = ["apple", "banana", "cherry"]
fruits.append("orange") # 添加元素
fruits.remove("banana") # 删除元素
fruits[1] = "blueberry" # 修改元素
print(fruits) # ['apple', 'blueberry', 'orange']
3. tuple(元组)
特点:
• 不可变,创建后不能修改(增删改)。
• 允许重复元素。
• 有序,保持插入顺序,支持索引操作。
适用场景:
• 适用于 数据不可变的情况,提高程序安全性和效率。
• 用于 键值对存储的键(如 dict 的键)。
• 适用于 多返回值 场景,比如函数返回多个结果:
def get_info():
return ("Alice", 25, "Engineer")
name, age, job = get_info()
• 适用于 地理坐标、数据库记录 等数据:
coordinates = (30.2672, -97.7431) # 经纬度
示例代码:
dimensions = (1920, 1080)
# dimensions[0] = 1280 # ❌ 错误,元组不可变
print(dimensions[0]) # 1920
4. dict(字典)
特点:
• 键不可重复,但值可以重复。
• 可变,可以动态增删改键值对。
• 有序(Python 3.7+),按照插入顺序存储。
适用场景:
• 适用于 键值对存储,方便查找和修改:
• 存储 学生信息:student = {"name": "Alice", "age": 20, "grade": "A"}
• 映射关系(如 HTTP 状态码):http_status = {200: "OK", 404: "Not Found"}
• 统计 数据出现次数(如单词频率统计):
word_count = {}
for word in ["apple", "banana", "apple"]:
word_count[word] = word_count.get(word, 0) + 1
print(word_count) # {'apple': 2, 'banana': 1}
示例代码:
person = {"name": "John", "age": 30}
person["city"] = "New York" # 添加键值对
person["age"] = 31 # 修改值
del person["name"] # 删除键值对
print(person) # {'age': 31, 'city': 'New York'}
5. set(集合)
特点:
• 不允许重复元素,自动去重。
• 可变,但 无序,无法通过索引访问。
• 适用于 数学集合操作(交集、并集、差集)。
适用场景:
• 适用于 去重:
unique_numbers = set([1, 2, 2, 3, 4, 4])
print(unique_numbers) # {1, 2, 3, 4}
• 适用于 集合运算(如用户交集、并集计算):
A = {1, 2, 3}
B = {3, 4, 5}
print(A & B) # {3} 交集
print(A | B) # {1, 2, 3, 4, 5} 并集
print(A - B) # {1, 2} 差集
• 适用于 快速查找,相比 list 用 in 关键字查找更快:
my_list = ["apple", "banana", "cherry"]
my_set = {"apple", "banana", "cherry"}
print("banana" in my_list) # 线性查找 O(n)
print("banana" in my_set) # 哈希查找 O(1)
示例代码:
colors = {"red", "blue", "green"}
colors.add("yellow") # 添加元素
colors.remove("blue") # 删除元素
print(colors) # 可能是 {'red', 'yellow', 'green'}
6. 总结
数据类型 | 特点 | 适用场景 |
---|---|---|
list | 可变、有序、允许重复 | 存储动态数据,列表操作,如任务队列、成绩单 |
tuple | 不可变、有序、允许重复 | 存储固定数据,如地理坐标、数据库记录、多返回值 |
dict | 可变、有序(3.7+)、键唯一 | 适用于键值对映射,如用户数据、配置项 |
set | 可变、无序、不允许重复 | 适用于去重、集合运算(交集、并集、差集) |