04.数据结构(下)

在学习列表时,你会发现它的元素是可重复的。如果要去除重复内容,用集合就对了。

4.3 集合

集合(set)和其他编程语言类似, 是一个无序不重复元素的数据结构。它的基本功能包括关系测试和消除重复元素,还可以计算交集、差集、并集等。set既然是无序的,那便不记录元素位置或者插入点,也不支持对元素的排序操作。
1.集合声明
集合可通过大括号{}或set()进行声明。但用{}声明时,一定要有元素,否则表示的是字典类型。集合元素可以同时存在不同的数据类型,重复的元素会被合并。

# {}为空时,是dict类型
set1 = {1, 2, 3}
print(type(set1), set1)
# 用set()声明一个空集合
set1 = set()
print(type(set1), set1)
# 支持不同数据类型
set1 = {"历史", 100, 25.68}
print(set1)

输出结果

<class 'set'> {1, 2, 3}
<class 'set'> set()
{25.68, '历史', 100}

2.新增
通过add(x)方法添加新的元素,如果元素已经存在,不会添加。

# 添加一个对象
p = {"Java", "C#"}
p.add("Python")
print(p)

输出结果

{'C#', 'Python', 'Java'}

通过update(seq)方法在原集合上一次性添加多个序列的多个值,重复的值会被合并。

# 将set2、set3添加到set1集合里
set1 = {1, 2, 3}
set2 = {4, 5, 6}
set3 = {5, 0, 2}
set1.update(set2, set3)
print(set1)

输出结果

{0, 1, 2, 3, 4, 5, 6}

3.删除
通过pop() 删除集合里的元素 。在开发工具里测试多次,删除的元素是随机的,不一定是最后一个。

# 用pop()删除元素
set1 = {"Android", "iOS", "Python", "C#"}
set1.pop()
print(set1)

输出结果

{'Python', 'Android', 'C#'}

remove(x) 删除x指定的一个元素,如若指定的x在集合里不存在,会报错。删除不会返回值。如果要指定删除的内容,即使不存在也不会报错的话,可用discard(x)方法。

# 用remove()删除元素
letters = {"a", "b", "c", "d"}
letters.remove("a")
print(letters)
# 用discard()删除元素
letters.discard("f")
print(letters)

输出结果

{'b', 'd', 'c'}
{'b', 'd', 'c'}

通过clear()方法清空集合内容。 del set 删除整个集合,删除后集合不能再访问。

# 清空集合内容
number = {5, 6, 7, 8}
number.clear()
print(number)
# 删除整个集合后,不可再访问
del number

输出结果

set()

4.访问
可用in关键字判断元素是否存在,用not in判断元素是否不存在。

# 用in判断元素是否存在
lang = {"Chinese", "English", "French", "German"}
print("English" in lang)
print("Japanese" not in lang)

输出结果

True
True

用max(set) 返回集合元素最大值,min(set) 返回集合元素最小值。

# 获取元素最大值
number = {5, 5, 6, 7, 8}
max_v = max(number)
print(max_v)
# 获取元素最小值
min_v = min(number)
print(min_v)

输出结果

8
5

在遍历集合时,经常会用到集合长度,可用len(set) 计算集合元素个数(即集合长度)。可直接用for循环遍历元素的内容。集合是无序的,不可以用下标的方式进行访问。

# 用len()计算集合长度
number = {1, 3, 4, 6}
length = len(number)
print(length)

# 遍历集合元素
for n in number:
print(n)

输出结果

4
1
3
4
6

5.交叉
两个集合之间会产生交集、并集、差集的情况。intersection()方法找出交集内容,union()方法获得并集内容, difference()返回集合的差集。可用issubset()判断指定集合是否为该方法参数集合的子集,issuperset()判断是否包含了指定集合的内容,是就返回True,否则返回False。

# 两个集合的交集
n1 = {1, 3, 4}
n2 = {1, 4}
print(n1.intersection(n2))
# 两个集合的并集
print(n1.union(n2))
# 集合的差集
print(n1.difference(n2))
# n2是否属于n1的子集
print(n2.issubset(n1))
# n1是包含了n2
print(n1.issuperset(n2))

输出结果

{1, 4}
{1, 3, 4}
{3}
True
True

6.转换
通过set()方法可把字符串、列表、元组转为集合。

# 字符串转为集合
s = "string"
set1 = set(s)
print(set1)
# 列表转为集合
lst = [1, 3, 4]
set2 = set(lst)
print(set2)
# 元组转为集合
t = ("a", "b", "c")
set3 = set(t)
print(set3)

输出结果

{'g', 't', 'n', 'r', 's', 'i'}
{1, 3, 4}
{'c', 'b', 'a'}

如果集合内容全是字符串,可直接通过join()方法将集合转成字符串。如果内容有其他数据类型,通过join(map(str, set))的方式转换。

# 集合(全字符串内容)转为字符串
set1 = {"O", "K", "!"}
print("".join(set1))
# 有浮点数内容
set1 = {100.66, "K"}
print("".join(map(str, set1)))

输出结果

OK!
100.66K

奥力给,集合到这就说完了。如果你觉得还不过瘾,那就转发出去。不是我吹牛,以我的资历和文凭,将来你所在城市的大街,都归我扫,前提,是我能用字典查到你所在的城市。

4.4 字典

字典(Dictionary)是由键和对应值成对组成的数据结构,它通常也被称为映射,或者叫关联数组,也有叫哈希表的。其中值可以取任何数据类型,但键必须是不可变的并且是唯一的,如字符串,数字或元组。
1.字典声明
字典可通过大括号{}或dict()进行声明。里面没有元素时,为空字典。字典的每个键值 key=>value 对用冒号 : 分割。字典元素可以同时存在不同的数据类型。键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。

# 用{}声明一个空字典
d = {}
print(type(d), d)
# 用dict()声明一个空字典
d = dict()
print(type(d), d)
# 用{}声明月份对应值
months = {"Jan": 1, "April": 4}
print(months)
# 用dict声明星期对应值
weekday = dict({1: "Mon", "2": "Tues"})
print(weekday)

输出结果

<class 'dict'> {}
<class 'dict'> {}
{'Jan': 1, 'April': 4}
{1: 'Mon', '2': 'Tues'}

2.增改
字典中的键不可改变,值可以。用dict[key]的方式添加新的内容,如果指定key已经存在,则修改对应的值内容。用dict.setdefault(key, default=None)的方式添加内容,可以key不存在,就添加,否则不做任何操作。

# 添加内容
weekday = {0: "Sun", 1: "Mon"}
print(weekday)
# 修改内容
weekday[2] = "Tues"
print(weekday)
# 添加内容
weekday.setdefault(3, "Wed")
print(weekday)

输出结果

{0: 'Sun', 1: 'Mon'}
{0: 'Sun', 1: 'Mon', 2: 'Tues'}
{0: 'Sun', 1: 'Mon', 2: 'Tues', 3: 'Wed'}

通过update(dict)方法在字典末尾一次性追加另一个字典的内容。

# 添加另外的字典内容
weekday = {0: "Sun", 1: "Mon"}
weekday.update({2: "Tues", 3: "Wed"})
print(weekday)

输出结果

{0: 'Sun', 1: 'Mon', 2: 'Tues', 3: 'Wed'}

3.删除
通过pop(key) 删除指定key对应的内容,返回值。如果指定的key不存在,会报错。

# 删除字典内容,返回值
student = {"name": "高强", "age": 16, "class": "三一班"}
v = student.pop("class")
print(student)
print(v)

输出结果

{'name': '高强', 'age': 16}
三一班

可通过del dict[key] 删除指定key对应的内容 , 如果key不存在,会报错。del dict 删除整个字典, 删除后无法再访问。另外可通过clear()清空字典内容。

# 删除字典内容,返回值
student = {"name": "高强", "age": 16, "class": "三一班"}
del student["class"]
print(student)
# 清空内容
student.clear()
print(student)
# 删除整个字典,不可再访问
del student

输出结果

{'name': '高强', 'age': 16}
{}

4.访问
通过dict.get(key, default=None)访问字典元素的值,如果指定的key不存在,返回默认值。
也可以通过dict[key]的方式访问字典的元素值,如果key不存在,会报错。

# 访问字典元素值
student = {"name": "高强", "age": 16, "class": "三一班"}
print(student.get("name"))
print(student["age"])

输出结果

高强
16

可用in判断key是否存在,是返回True,否则返回False。not in为相反方式。

# 判断是否存在key
weekday = {"Sun": 0, "Sat": 6, "Fri": 5}
if "Sun" in weekday:
weekday.pop("Sun")
print(weekday)

输出结果

{'Sat': 6, 'Fri': 5}

5.遍历
字典由键值对组成,可用len(dict) 计算字典键的个数(即字典长度),可用keys()方法获取字典的所有键内容并遍历,可用values()方法获取字典的所有值内容并遍历。如果要同时获取键和值的所有内容,可用items()方法。

# 计算字典长度
weekday = {"Sun": 0, "Sat": 6, "Fri": 5}
print(len(weekday))
# 遍历所有键内容
for k in weekday.keys():
print(k)
# 遍历所有值内容
for k in weekday.values():
print(k)
# 同时遍历键和值内容
for k, v in weekday.items():
print(k, v)

输出结果

3
Sun
Sat
Fri
0
6
5
Sun 0
Sat 6
Fri 5

6.转换
开发程序的过程中,经常会用到json数据,而json可与dict字典进行转换。用dumps()函数将dict数据转化成json数据,用loads()函数将json数据转化成dict数据。

# 引入json模块
import json
# 字典内容转为json
dict1 = {"name": "cow", "age": 22, "gender": "male"}
json_data = json.dumps(dict1)
print(type(json_data), json_data)
# json内容转为字典
json_data = '{"id": "007", "name": "007", "email": "123@xx.com"}'
dict1 = json.loads(json_data)
print(type(dict1), dict1)

输出结果

<class 'str'> {"name": "cow", "age": 22, "gender": "male"}
<class 'dict'> {'id': '007', 'name': '007', 'email': '123@xx.com'}

好了,有关数据结构的内容讲完了。

上一篇

05.函数详解