关于我转生开始学python的那件事(六)——使用dict与set

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中是否存在对应的值,我们可以用两种方法

  1. 使用in来进行判断

    >>> 'Anker' in d
    False
  2. 使用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,dictset四种常见的数据类型,现在把它们纵向放一起进行对比

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 可变、无序、不允许重复 适用于去重、集合运算(交集、并集、差集)
博客内容均系原创,未经允许严禁转载!
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇