一、字典(dict):可变数据类型
1-1、字典的特点
- 字典是可变数据类型(list也是),具有增、删、改等一系列的操作;
- 字典中的元素是无序的(hash)
- key必须唯一,value可以重复
- key要求是不可变序列!
- 多次对一个key放入value,后面的值会把前面的值冲掉。
这种key-value存储方式,在放进去的时候,必须根据key算出value的存放位置,这样,取的时候才能根据key直接拿到value。
1-2、字典的创建
1、使用花括号 {}
来创建一个字典,或者使用 dict()
函数
字典的value可以是不同类型
2、使用zip函数创建字典
zip()
函数可以将多个可迭代对象(如列表、元组等)的元素进行配对,并返回一个迭代器,该迭代器会生成一个个由这些元素组成的元组。然后,你可以利用这个迭代器来创建一个字典。
如果
keys
和values
列表的长度不一致,zip()
函数会停止在最短的输入序列结束时。
3、zip函数,同步迭代
【注意】:
输出结果不对!因为fruit是set集合,set集合是无序的,所以,每次运行,里面的元素顺序都是不一样的!
字典是属于序列的,所以,序列当中的函数,字典也能用!
【回顾】:序列的函数
1-3、字典元素的取值
1-4、遍历字典
# 遍历键
for key in my_dict:
print(key)
# 遍历值
for value in my_dict.values():
print(value)
# 遍历键值对1
for key, value in my_dict.items():
print(f"{key}: {value}")
# 遍历键值对2
for item in my_dict.items():
print(item)
1-5、字典的相关操作
python中一切皆对象,每一个对象都有一个boolean值。
空列表 = 空元祖 = 空字典 = False
1-6、字典合并
使用 |
运算符、 update()
方法,来合并两个字典。
dict1 = {'a': 1, 'b': 2}
dict2 = {'b': 3, 'c': 4}
# 使用 | 运算符合并字典(Python 3.9+)
merged_dict = dict1 | dict2
print(merged_dict) # 输出: {'a': 1, 'b': 3, 'c': 4}
# 使用 update() 方法合并字典
dict1.update(dict2)
print(dict1) # 输出: {'a': 1, 'b': 3, 'c': 4}
1-7、字典生成式
1-8、dict 对比 list
和list比较,dict有以下几个特点:
- 查找和插入的速度极快,不会随着key的增加而变慢;
- 需要占用大量的内存,内存浪费多。
而list相反:
- 查找和插入的时间随着元素的增加而增加;
- 占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
二、集合(Set):可变数据类型
set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。
存储不可变数据类型。
集合是无序的,并且不支持索引和切片操作。集合的主要功能是进行集合运算,比如并集、交集、差集等。
2-1、集合的创建、删除
集合set也是序列的一种,所以,序列函数,集合也能使用。
集合的生成式
2-2、集合的元素的添加、删除
1、添加
add()
方法可以向集合中添加元素。如果元素已经存在,则不会重复添加。
2、删除
使用 remove()
方法移除集合中的元素。如果元素不存在,则会抛出 KeyError
。
也可以使用 discard()
方法,如果元素不存在则不会抛出异常。
另外,可以使用 pop()
方法移除并返回集合中的一个随机元素(在Python 3.7+版本中,pop() 返回的是最后一个被添加的元素)
my_set = {1, 2, 3, 4}
my_set.remove(3)
print(my_set) # 输出: {1, 2, 4}
# my_set.remove(5) # 这行会抛出 KeyError
my_set.discard(4)
print(my_set) # 输出: {1, 2}
element = my_set.pop()
print(element) # 输出可能是 1 或 2,具体取决于实现
print(my_set) # 输出: {剩下的那个元素}
2-3、集合的运算
判断子集和超集
使用 issubset()
和 issuperset()
方法来判断一个集合是否是另一个集合的子集或超集。
集合的其他方法
clear()
:清空集合中的所有元素。copy()
:返回集合的一个浅拷贝。update()
:更新集合,添加多个元素。
my_set = {1, 2, 3}
my_set.clear()
print(my_set) # 输出: set()
my_set = {1, 2, 3}
copied_set = my_set.copy()
print(copied_set) # 输出: {1, 2, 3}
my_set.update([4, 5, 6])
print(my_set) # 输出: {1, 2, 3, 4, 5, 6}
2-4、集合的遍历操作
三、列表、元组、字典、集合的区别
set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样。
四、不可变对象
对于不变对象来说,调用对象自身的任意方法,也不会改变该对象自身的内容。
相反,这些方法会创建新的对象并返回,这样,就保证了不可变对象本身永远是不可变的。
五、可迭代对象
"可迭代对象"(iterable)指的是那些可以被遍历的对象,即你可以从中获取元素,直到遍历完整个对象。
更具体地说,可迭代对象实现了Python的__iter__()
方法(该方法返回一个迭代器对象)或__getitem__()
方法(该方法支持通过索引访问元素,并且当索引超出范围时引发IndexError
异常)。不过,在大多数情况下,你只需要关注__iter__()
方法,因为它更为常见且是迭代器协议的一部分。
在Python中,大多数内置的数据结构(如列表、元组、集合、字典、字符串等)都是可迭代的。
此外,任何实现了迭代器协议的对象也都是可迭代的。
迭代器(iterator)则是可迭代对象的一个特例,它不仅实现了__iter__()
方法,还实现了__next__()
方法。
当你想要遍历一个可迭代对象时,你通常会使用循环(如for循环)。在循环内部,Python会自动调用可迭代对象的__iter__()
方法来获取一个迭代器,并通过迭代器的__next__()
方法来获取每个元素,直到捕获到StopIteration
异常为止(这标志着迭代的结束)。