数据结构——字典和集合

一、字典的创建和使用
1、创建字典

字典以键值对(键和值的组合)的方式把数据组织到一起,我们可以通过键找到与之对应的值并进行操作。创建字典可以使用大括号创建。键和值通过冒号分隔开,冒号前为键(key),冒号后是值(value),需要注意的是,字典是允许value重复,但不允key重复,也就是说key是唯一的,key也必须是不可变类型。

dict1 = {"name": "z7sz", "title": "blog", "tel": "1234567890"}

用字典来保存某组相关信息是远远优于列表和元组。

我们也可以使用内置函数dict或者是字典的生成式语法来创建字典

# dict函数(构造器)中的每一组参数就是字典中的一组键值对
dict1 = dict(name="z7sz",title="blog",tel="1234567890")

# 可以通过Python内置函数zip压缩两个序列并创建字典
dict2=dict(zip(['name','title','tel'],['z7sz','blog','1234567890']))

# 用字典生成式语法创建字典
dict3= {x:y for x,y in zip(['name','title','tel'],['z7sz','blog','1234567890'])}

想知道字典中有多少组数据,依旧用len函数,想对字典进行遍历用for循环,这两点跟之前讲列表元组的时候是一样的。

2、字典的运算

字典最重要的是成员运算和索引运算,成员运算可以判断指定的key在不在字典中,索引运算可以通过key来获取对应的value或者向字典中插入新的键值对。

dict1 = {"name": "z7sz", "title": "blog", "tel": "1234567890"}
#检查name是否在字典中
print('name' in dict1)  #True

#修改title的值
dict1['title'] = '学习笔记'

#通过索引操作插入新的键值对
dict1['size'] = "blog.z7sz.top"
print(dict1)   #{'name': 'z7sz', 'title': '学习笔记', 'tel': '1234567890', 'size': 'blog.z7sz.top'}

# 对字典的键进行循环并通索引运算获取键对应的值
for key in dict1:
    print(f"{key}:{dict1[key]}")

在通过索引运算获取字典中的值时,如指定的键没有在字典中,将会引发KeyError异常。

3、字典的方法

字典类型的方法基本上都跟字典的键值对操作相关。

dict1 = {"name": "z7sz", "title": "blog", "tel": "1234567890"}

# get方法可以通过key来取值,如果取不到则返回None或设定的默认值
print(dict1.get('name'))  #z7sz
print(dict1.get('name1'))  #None
print(dict1.get('name1',{'name':'None'}))   #{'name': 'None'}

# 获取字典中所有的key
print(dict1.keys())  #dict_keys(['name', 'title', 'tel'])
# 获取字典中所有的值
print(dict1.values())  #dict_values(['z7sz', 'blog', '1234567890'])
# 获取字典中所有的键值对
print(dict1.items())  #dict_items([('name', 'z7sz'), ('title', 'blog'), ('tel', '1234567890')])
# 通过字典方法来对字典进行遍历
for k,v in dict1.items():
    print(f"{k}:{v}")
    
# 使用pop方法通过键删除对应的键值对并返回该值,pop跟get方法类似,可以设置删除不到值的默认值
# 跟列表一样,删除元素也可以用del关键字来删除,比如del dict1['name']
name=dict1.pop('name')
print(name)  #'z7sz'
print(dict1) #{'title': 'blog', 'tel': '1234567890'}

# setdefault用于设置新的键值对
# 如果这个键在字典中存在,setdefault返回原来与这个键对应的值
# 如果这个键在字典中不存在,向字典中添加键值对,返回第二个参数的值,默认为None
result = dict1.setdefault('name','z7sz1')
print(result)  #z7sz1
print(dict1)   #{'title': 'blog', 'tel': '1234567890', 'name': 'z7sz1'}

# 使用update更新字典元素,相同的键会用新值覆盖掉旧值,不同的键会添加到字典中
dict1.update({'name':'z7sz2'})
print(dict1)  #{'title': 'blog', 'tel': '1234567890', 'name': 'z7sz2'}
dict1.update(a=111,b=222)
print(dict1)  #{'title': 'blog', 'tel': '1234567890', 'name': 'z7sz2', 'a': 111, 'b': 222}

# copy和clear用于复制和清空字典
dict2=dict1.copy()
print(dict2)  #{'title': 'blog', 'tel': '1234567890', 'name': 'z7sz2', 'a': 111, 'b': 222}
dict2.clear()
print(dict2)  #{}

Python程序中的字典跟现实生活中字典非常像,允许我们以键值对的形式保存数据,再通过键索引对应的值。这是一种非常有利于数据检索的数据类型

二、集合的创建和使用

python中的集合跟数学中的集合几乎是一致,集合具有无序性和互异性,python中的集合数据类型也是一样。无序性说明集合中的元素是没有顺序的,所以集合肯定不能支持索引运算;互异性指的是集合中不能有重复元素,说白点就是集合会对元素进行去重操作。

1、创建集合

集合也同样用大括号表示,且大括号内至少有一个元素,这是因为空{}会被python定义成空字典。集合也可以用set函数创建,另外,集合中不能包含可变类型数据,集合本身也是可变类型,所以集合中不能包含集合。

set1={1,2,3,4,5,5,'5'}
print(set1)  #{1, 2, 3, 4, 5, '5'}
print(len(set1))  #6

#使用set创建集合,set也可以将列表转换成集合
set2=set('hello')
print(set2)  #{'l', 'h', 'e', 'o'}

#使用集合生成式
set3={i for i in range(5)}
print(set3)  #{0, 1, 2, 3, 4}

# 集合元素的循环遍历
for i in set3:
    print(i)
2、集合的运算

Python为集合类型提供了非常丰富的运算符,主要包括:成员运算、交集运算、并集运算、差集运算、比较运算(相等性、子集、超集)等。

2.1、成员运算

可以通过成员运算innot in 检查元素是否在集合中。

set1 = {11, 12, 13, 14, 15}
print(10 in set1)        # False 
print(15 in set1)        # True
2.2、交并差运算

Python中的集合跟数学上的集合一样,可以进行交集、并集、差集等运算,而且可以通过运算符和方法调用两种方式来进行操作。

set1 = {1, 2, 3, 4, 5, 6, 7}
set2 = {2, 4, 6, 8, 10}

# 交集
# 方法一: 使用 & 运算符
print(set1 & set2)                # {2, 4, 6}
# 方法二: 使用intersection方法
print(set1.intersection(set2))    # {2, 4, 6}

# 并集
# 方法一: 使用 | 运算符
print(set1 | set2)         # {1, 2, 3, 4, 5, 6, 7, 8, 10}
# 方法二: 使用union方法
print(set1.union(set2))    # {1, 2, 3, 4, 5, 6, 7, 8, 10}

# 差集
# 方法一: 使用 - 运算符
print(set1 - set2)              # {1, 3, 5, 7}
# 方法二: 使用difference方法
print(set1.difference(set2))    # {1, 3, 5, 7}

# 对称差
# 方法一: 使用 ^ 运算符
print(set1 ^ set2)                        # {1, 3, 5, 7, 8, 10}
# 方法二: 使用symmetric_difference方法
print(set1.symmetric_difference(set2))    # {1, 3, 5, 7, 8, 10}
# 方法三: 对称差相当于两个集合的并集减去交集
print((set1 | set2) - (set1 & set2))      # {1, 3, 5, 7, 8, 10}
2.3、比较运算

两个集合可以用==!=进行相等性判断,如果两个集合中的元素完全相同,那么==比较的结果就是True,否则就是False

set1 = {1, 3, 5}
set2 = {1, 2, 3, 4, 5}
set3 = set2
# <运算符表示真子集,<=运算符表示子集
print(set1 < set2, set1 <= set2)    # True True
print(set2 < set3, set2 <= set3)    # False True
# 通过issubset方法也能进行子集判断
print(set1.issubset(set2))      # True

# 反过来可以用issuperset或>运算符进行超集判断
print(set2.issuperset(set1))    # True
print(set2 > set1)              # True
3、集合的方法

python中的集合是可变类型,我们可以通过集合类型的方法为集合添加或删除元素。

# 创建一个空集合
set1 = set()

# 通过add方法添加元素
set1.add(33)
set1.add(55)
set1.update({1, 10, 100, 1000})
print(set1)    # {33, 1, 100, 55, 1000, 10}

# 通过discard方法删除指定元素
set1.discard(100)
set1.discard(99)
print(set1)    # {1, 10, 33, 55, 1000}

# 通过remove方法删除指定元素,建议先做成员运算再删除
# 否则元素如果不在集合中就会引发KeyError异常
if 10 in set1:
    set1.remove(10)
print(set1)    # {33, 1, 55, 1000}

# pop方法可以从集合中随机删除一个元素并返回该元素
print(set1.pop())

# clear方法可以清空整个集合
set1.clear()
print(set1)    # set()
4、不可变集合

python除了普通的集合之外,还有一种不可变类型的集合,叫frozensetsetfrozenset的区别就如同listtuple的区别,frozenset由于是不可变类型,能够计算出哈希码,因此它可以作为set中的元素。除了不能添加和删除元素,frozenset在其他方面跟set基本是一样的。

set1 = frozenset({1, 3, 5, 7})
set2 = frozenset(range(1, 6))
print(set1 & set2)    # frozenset({1, 3, 5})
print(set1 | set2)    # frozenset({1, 2, 3, 4, 5, 7})
print(set1 - set2)    # frozenset({7})
print(set1 < set2)    # False

我的博客:https://blog.z7sz.top

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xingyuzhongxuan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值