每日一课 | dict 和 set 基本操作、字典视图等 6 个方面详解总结

07.

dict和set基本操作......

大家好,我是小C,上期给大家分享带来——List和 tuple的13个经典案列(完结篇)

本期分享内容:dict 和 set 基本操作、字典视图等 6 个方面详解总结

本专栏小C邀请的是zglg (某大厂算法工程师)和Alicia (美国顶尖学府 AI 博士后)两位为我们分享Python全栈精通之路。

作者有话说

很多人问为什么要写这个专栏?


因为我也有过那段“自学” Python 的迷茫时期,所以深知一个好的系统学习规划和老师讲解,是能够达到事半功倍省下我们程序员更多青春的关键。


别的老师在介绍知识点时都会说“这东西是什么”,但我不想这样做。


我觉得“为什么这东西是这样”或者“在什么场景适应什么需求有什么好处才会用这东西”,反而更能让你们对知识本身会有更深刻的理解。

PYTHON

dict 和 set 基本操作、字典视图等 6 个方面详解总结)

字典

字典(dict),一种映射对象(mapping)类型,键值对的容器。

五种创建方法

创建 dict 的方法很简单,使用一对中括号 {},键值对中间用冒号,每项间使用逗号分割。

1. 手动创建

empty = {}

dic = {'a':1,'c':3,'e':5}

2. 使用 dict() 构造函数

In [10]: dict(a=1,b=2,c=3)

Out[10]: {'a': 1, 'b': 2, 'c': 3}

3. 键值对 + 关键字参数

第一个参数为字典,后面是一系列关键字参数,如 c=3:

In [9]: dict({'a':1,'b':2},c=3,d=4)

Out[9]: {'a': 1, 'b': 2, 'c': 3, 'd': 4}

4. 可迭代对象

列表,元素又为一个元组,后面再加一系列关键字参数。

In [8]: dict([('a',1),('b',2)],c=3)

Out[8]: {'a': 1, 'b': 2, 'c': 3}

5. fromkeys() 方法

已知键集合(keys),values 为初始值:

In [7]: {}.fromkeys(['k1','k2','k3'],[1,2,3])

Out[7]: {'k1': [1, 2, 3], 'k2': [1, 2, 3], 'k3': [1, 2, 3]}

In [14]: {'a':1,'b':2}.fromkeys(['c','d'],[1,2])

Out[14]: {'c': [1, 2], 'd': [1, 2]}、

基本操作

基本操作包括:

⦁创建字典

⦁遍历字典

⦁获取所有键集合(keys)

⦁获取所有值集合(values)

⦁获取某键对应的值

⦁添加、修改或删除一个键值对

创建字典 d:

In [2]: d = {'a':1,'b':2,'c':3}

字典属于容器,遍历容器每一项:

In [3]: for key, val in d.items():

   ...:     print(key,val)

结果:

a 1

b 2

c 3

获取所有键集合:

# 方法 1

In [4]: set(d)

Out[4]: {'a', 'b', 'c'}

# 方法 2

In [6]: set(d.keys())

Out[6]: {'a', 'b', 'c'}

获取所有值集合:

In [7]: set(d.values())

Out[7]: {1, 2, 3}

判断键是否在字典中:

# 判断键 c 在 d 中?

In [8]: if 'c' in d:

   ...:     print('键c在字典d中')

键c在字典d中

# 判断键 c 不在 d 中?

In [9]: if 'e' not in d:

   ...:     print('键e不在字典d中')

键e不在字典d中

获取某键对应的值:

In [10]: d.get('c')

Out[10]: 3

添加或修改一个键值对:

In [11]: d['d'] = 4

    ...: print(d) 

{'a': 1, 'b': 2, 'c': 3, 'd': 4}

删除一个键值对:

# 方法 1

In [12]: del d['d']

    ...: print(d)

{'a': 1, 'b': 2, 'c': 3}

# 方法 2

In [13]: d.pop('c') # 返回 3

    ...: print(d) 

{'a': 1, 'b': 2}

字典视图

字典自带的三个方法 d.items()、d.keys()、d.values(),分别返回如下对象:

In [14]: d = {'a': 1, 'b': 2, 'c': 3}

In [15]: d.keys()

Out[15]: dict_keys(['a', 'b', 'c'])

    

In [16]: d.values()

Out[16]: dict_values([1, 2, 3])

    

In [17]: d.items()

Out[17]: dict_items([('a', 1), ('b', 2), ('c', 3)])

它们都是原字典的视图,修改原字典对象,视图对象的值也会发生改变。

a = {'a':1, 'b':2, 'c':3}

key_lst = a.keys() # 创建字典的键集合视图

代码可视图如下所示:

 

删除键 b,由代码执行可视化图可看到,视图对象 key_lst 值也发生改变。

 

items(),也是返回一个视图对象:

a = {'a':1, 'b':2, 'c':3}

items = a.items()

 

修改字典,可看到视图对象 items 的值也会改变:

a['c']=4

 

字典的键

所有对象都能作为字典的键吗?

如果一个列表对象 lst 试图作为字典的键,会出现什么问题。

实验一下:

In [1]: lst = [1,2]

In [2]: d = {lst:'ok?'}

TypeError: unhashable type: 'list'

会抛出如上 TypeError 异常:不可哈希的类型 list。

因为列表是可变对象,而可变对象是不可哈希的,所以会抛出如上异常。

结论:可哈希的对象才能作为字典的键,不可哈希的对象不能作为字典的键。

集合

集合是一种不允许元素出现重复的容器。

案例:判断一个列表中是否含有重复元素,便可借助集合这种数据类型。

def duplicated(lst):

    return len(lst)!=len(set(lst)) # 不相等就意味着含重复元素

创建

与字典(dict)类似,集合(set)也是由一对花括号({})创建。但是,容器内的元素不是键值对。

a = {1, 2, 3}

示意图如下:

 

同字典类似,集合内的元素必须是可哈希类型(hashable)。

这就意味着 list、dict 等不可哈希的对象不能作为集合的元素。

In [1]: {[1,2]}

TypeError: unhashable type: 'list'

另一种创建集合的方法,是通过 Python 的内置的 set 函数,参数类型为可迭代对象 Iterable。

In [1]: set([1,3,5,7])

Out[1]: {1, 3, 5, 7}

常用方法

集合自带的方法与数学中的集合操作比较类似,提供查找集合间的并、交、差集、子集判断。

求并集:

a = {1,3,5,7}

b, c = {3,4,5,6}, {6,7,8,9}

d = a.union(b,c) # {1, 3, 4, 5, 6, 7, 8, 9}

 

求差集:

a = {1,3,5,7}

b, c = {3,4,5,6}, {6,7,8,9}

d = a.difference(b,c) # {1}

 

求交集:

a = {1,3,5,7}

b, c = {3,4,5,6}, {6,7,8,9}

d = a.interp(b,c) # {}

 

a 是 b 的子集吗?

In [15]: a = {1,3,5,7}

In [16]: b = {3,4,5,6}

In [17]: a.issubset(b)

Out[17]: False

In [18]: a.issubset(a)

Out[18]: True

In [19]: a.issubset({1,3,5,7,8})

Out[19]: True

小结

今天,与大家一起学习了 Python 另一类 hash map table。包括:

  • 字典创建的五种创建方法和基本操作

  • 字典视图

以及,不能包含重复元素的集合(set)的创建和常用方法。

今日内容有get吗,欢迎各位留言讨论!

以上,咱们《Python全栈60天精通之路》七天专栏分享就结束了,如需了解更多,小伙伴们可识别下方二维码,订阅专栏,咱们下期专栏见!

了解更多详情

可识别下方二维码

往期推荐

每日一课 | 详解Python的两大特性

每日一课 | Python的四大基本语法

每日一课 | Python的四大数据类型

每日一课 | List和 tuple的基本操作

每日一课 | List和 tuple的13个经典案列-01

每日一课 | List和 tuple的13个经典案列(完结篇)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值