Python中的字典与集合
1.字典
字典,类似于我们日常中所使用的字典,是一种映射存储的方式。字典分为两个部分,一个是键(key),一个是key所关联的值(value)。我们可以认为,一个键关联(或绑定)一个值,称为键值对。字典就是以键值对的形式来存储数据的。
字典的特点:
- 字典中的键值对是无序的
- 字典中的key不能重复
- 字典中的key必须是不可变类型(可哈希)
1.1 字典的创建
可以使用如下方式来创建字典:
①使用键值对:
x = {“a”: 100, “b”: 200}
②使用dict函数:
x = dict(a=100, b=100)
空字典:
dnull={}
创建字典后也可以增加或删除字典的键值对,如果key
已经存在,则修改value
,如果不存在,则新创建键值对:
x[“new_key”] = “new value”
del x[“new_key”]
说明:
- 访问字典中的元素不能使用索引,因为字典是无序的,访问字典的正确方法是通过key来访问,如字典[key]返回value。
- 字典跟列表相比,牺牲空间来提高时间。
- 定义字典的时候如果出现重复的key,会使用最后一个赋值将之前的key-value覆盖。
1.2 字典相关方法
get(key[, default])
pop(key[, default])
keys()
values()
items()
clear()
setdefault(key[,default])
update([E, ]**F)
popitem()
fromkeys(iterable, value=None)
copy()
1.3 字典的运算
字典不支持 + * > <
,字典支持如下的运算符:
符号 | 说明 |
---|---|
e in x | 如果x中存在e键,返回True,否则返回False。 |
e not in x | 如果x中不存在e键,返回True,否则返回False。 |
x ==,!= y | 比较x,y的键值对. |
x is,is not y | 判断x,y是否为同一个字典 |
x 布尔 y | 与数值类型的布尔运算规则相同(返回两个字典中的一个) |
说明:
- 假设上表中,x与y是字典类型,e为某元素(代表键)。
- 字典不支持 >= 与 <= 运算。
- len函数也可以应用与字典类型,返回字典中键值对的个数。
1.4 字典的遍历
①通过keys()
遍历:
b={4:"php",5:"c++",9:[1,2,3]}
print(b.keys())
for i in b.keys():
print(i,b[i])
②通过values()
遍历:
print(b.values())
for i in b.values():
print(i)
③通过items()
遍历:
print(b.items())
for k,v in b.items():
print(k,v)
for i in b.items():
print(i[0],i[1])
for i in b.items():
print(i)
1.5 字典推导式
{输出表达式 for k,v in 字典}
b={4:"php",5:"c++",9:[1,2,3]}
new_b = {k*2:v for k,v in b.items()}
print(new_b)
# output:
# {8: 'php', 10: 'c++', 18: [1, 2, 3]}
2.集合
2.1集合的创建
集合可以包含一组元素,与字典类似,也是使用{}来表示。不同的是,字典存储的是一组键值对,而集合存储的是单一元素。看成是value值为none的字典.
例如:
s = {1, 2, 3, 4}
如果在创建集合时,指定了重复的元素,则重复的元素会自动的去除。如果想要创建一个空的集合,不能使用:
s = {}
而是需要使用:
s = set()
因为前者创建的不是空的集合,而是空的字典。
2.2 集合的特征
集合具有如下特征:
- 集合中不含有重复的元素。
- 集合中不保证元素是有顺序的。
- 集合中的元素类型必须是可哈希类型。
2.3 集合的运算
集合支持以下运算:
符号 | 说明 |
---|---|
e in x | 如果x中存在e键,返回True,否则返回False。 |
e not in x | 如果x中不存在e键,返回True,否则返回False。 |
x & y | 返回x与y的交集,相当于x. intersection(y)。 |
x l y | 返回x与y的并集,相当于x.union(y)。 |
x - y | 返回x与y的差集,相当于x. difference(y)。 |
x ^ y | 返回x与y的对称差集,相当于x. symmetric_difference(y)。 |
x ==,!= y | 比较x,y中的元素是否一致。 |
x >,>=,<=,< y | 比较x是否为y的父集(子集) |
x is,is not y | 判断两个集合是否为同一个集合 |
x 布尔 y | 与数值类型的布尔运算规则相同(返回两个集合中的一个) |
说明:假设上表中,x与y是集合类型,e为某元素。
2.4 相关方法
add(elem)
remove(elem)
discard(elem)
pop()
clear()
copy()
difference(*s)
difference_update(*s)
intersection(*s)
intersection_update(*s)
union(*s)
update(*s)
symmetric_difference(s)
symmetric_difference_update(s)
isdisjoint(s)
issubset(s)
issuperset(s)
2.5 集合的遍历
b={"a","b","c","d","f","h"}
for i in b:
print(i)
2.6 集合的推导式
a={1,2,3,4}
b={"a","b","c"}
print({i*2 for i in a})
print({i*2 for i in b})
print({i+"_new" for i in b})
3.字典与集合总结
字典是一系列无序元素的组合,其长度大小可变,元素可以任意地删减和改变。不过要注意,这里的元素,是一对键(key)和值(value)的配对。
相比于列表和元组,字典的性能更优,特别是对于查找、添加和删除操作,字典都能在常数时间复杂度内完成,这是因为字典的内部组成是一张哈希表,你可以通过键的哈希值,快速找到其对应的值。
对于字典,我们通常会根据键或值,进行升序或降序排序,由于字典本身是无序的,所以会返回一个列表。列表中的每个元素,是由原字典的键和值组成的元组。
而对于集合,其排序和前面讲过的列表、元组很类似,直接调用sorted(set)即可,结果会返回一个排好序的列表。
d = {'b': 1, 'a': 2, 'c': 10}
d_sorted_by_key = sorted(d.items(), key=lambda x: x[0]) # 根据字典键的升序排序
d_sorted_by_value = sorted(d.items(), key=lambda x: x[1]) # 根据字典值的升序排序
print(d_sorted_by_key)
print(d_sorted_by_value)
# output:
#[('a', 2), ('b', 1), ('c', 10)]
#[('b', 1), ('a', 2), ('c', 10)]
s = {3, 4, 2, 1}
print(sorted(s)) # 对集合的元素进⾏升序排序
# output:
#[1, 2, 3, 4]
而集合和字典基本相同,唯一的区别,就是集合没有键和值的配对,是一系列无序的、唯一的元素组合。需要注意的是,集合并不支持索引操作,因为集合本质上是一个哈希表,和列表不一样。
s = {1,2,3}
s [0]
# output:
# TypeError Traceback (most recent call last)
# <ipython-input-5-70f42fd79648> in <module>
# 1 s = {1,2,3}
# ----> 2 s [0]
# TypeError: 'set' object is not subscriptable
4.常见数据类型转换
int(x) #将x转换成为一个整数
float(x) #将x转换成为一个浮点数
str(x) #将x转换成为一个字符串
bool(x) #将x转换成为布尔类型
tuple(s) #将序列转换成元组
list(s) #将序列转换成列表
set(s) #将序列转换成集合
dict(d) #将一个元素为kw形式的序列转换成字典