零基础入门Python小甲鱼-笔记10

第七章 字典 和集合

7.1 字典:当索引不好用时

Python的字典把这个字(单词)称为”(key)”,把其对应的含义称为”值(value)”

字典是Python中唯一的映射类型,映射:指两个元素集之间元素相互”对应”地关系

列表(序列类型)以数组的形式存储,通过索引的方式来获取相应位置的值,一般索引值与对应位置存储的数据是毫无关系的

通过一个小demo:

先定义一个列表,因为”xiaoWang”这个名字写错了,通过代码修改:

nameList = ['xiaoZhang', 'xiaoWang', 'xiaoLi'];
nameList[1] = 'xiaoxiaoWang'

如果列表的顺序发生了变化,此时就需要修改下标,才能完成名字的修改 ,如下

nameList = ['xiaoWang', 'xiaoZhang',  'xiaoLi']
nameList[0] = 'xiaoxiaoWang'

通过上面的例子可以看出字典的在某些方面的重要性

7.1.1 创建和访问字典

字典的特点总结:

  • 使用标志性符号({})来定义
  • 字典的每个元素由2部分组成,键:值。
  • 有多个键及其对应的值共同构成,每一对键值组合称为是项。
  • 字典讲究映射,不讲顺序,所以字典的顺序会发生改变
  • 字典中找某个元素时,是根据’名字’ (key)
  • 字典的键(key)必须是独一无二,而值可以取任何数据类型,但必须是可以变的(如:字符串,数或元组)
创建字典的方法 代码展示
方法1 empty = {}
方法2 dict1 = dict(((‘F’,70),(‘i’,105),(’s’,115),(‘h’,104),(‘C’,67)))
方法3 dict1 = dict(F=70,i=105,s=115,h=104,c=67)
方法4 dict1[‘x’] = 88 #先创建一个字典
方法5 dict1 = {‘one’:1,’two’:2,’three’:3}
方法6 dict1 = dict(zip([‘one’,’two’,’three’],[1,2,3]))
方法7 dict1 = dict([(‘one’,1),(‘two’,2),(‘three’,3)])
方法8 dict1 = dict({‘one’:1,’two’:2,’three’:3})

上面的这几种方法都是为了实现一个目的:创建字典

方法1:

>>> empty = {}
>>> empty
{}

方法2(我个人觉得十分不好用,很容易出错):

为什么要那么多的括号?因为dict()函数可以是一个序列(但不能是多个),所以要打包成一个元组序列(列表)

>>> dict1 = dict((('F',70),('i',105),('s',115),('h',104),('C',67)))
>>> dict1
{'F': 70, 'C': 67, 's': 115, 'i': 105, 'h': 104}

方法3:

通过提供映射关系的参数来创建字典:

>>> dict1 = dict(F=70,i=105,s=115,h=104,c=67)
>>> dict1
{'c': 67, 'h': 104, 's': 115, 'i': 105, 'F': 70}

方法4:
直接给字典的键赋值,如果键存在,则改写键对应的值,如果不存在,则创建一个新的键并赋值:

>>> dict1
{'c': 67, 'h': 104, 's': 115, 'i': 105, 'F': 70}
>>> dict1['x'] = 88
>>> dict1
{'c': 67, 's': 115, 'x': 88, 'h': 104, 'F': 70, 'i': 105}
>>> dict1['x'] = 666
>>> dict1
{'c': 67, 's': 115, 'x': 666, 'h': 104, 'F': 70, 'i': 105}

就大概说这几种方法,有兴趣的,自己去尝试一下,还有就是选择自己认为比较好的方法用。

7.1.2 各种内置方法

常用BIF(内置方法) 说明
fromkeys() 创建并返回一个新的字典
keys() 返回字典中的键
values() 返回字典中所有的值
items() 返回中亲自点中所有的键值对(也就是项)
get() 提供更宽松的方式去访问字典项
clear() 清空一个字典
copy() 复制字典
pop() 给定键弹出对应的值
popitem() 弹出第一个的键值对(项)
update() 更新字典
setdefault() 在字典中找不到相应的键时会自动添加

1.fromkeys()

它有两个参数:第一个参数是字典的键,第二个参数是可选的,是传入键对应的值。如果不提供,那么默认是None。

小demo展示一下:

>>> dict1 = {}
dict
>>> dict1.fromkeys((1,2,3))
{1: None, 2: None, 3: None}
>>> dict2 = {}
>>> dict2.fromkeys((1,2,3),'Number')
{1: 'Number', 2: 'Number', 3: 'Number'}
>>> dict3 = {}
>>> dict3.fromkeys((1,2,3),('one','two','three'))
{1: ('one', 'two', 'three'), 2: ('one', 'two', 'three'), 3: ('one', 'two', 'three')}

PS.fromkeys()方法并不会将’one’、’two’,、’three’分别赋值键1,2,3,因为fromkeys()把(‘one’, ‘two’, ‘three’)当成一个值。

2.keys()

返回字典中的键,活学活用,上面刚学到了,下面就可以使用

>>> dict1 = {}
>>> dict1 = dict1.fromkeys(range(10),'赞')
>>> dict1.keys()
dict_keys([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

3.values()

返回字典中所有的值

接着上面的基础运行:

>>> dict1.values()
dict_values(['赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞', '赞'])

4.items()

返回中亲自点中所有的键值对(也就是项)

>>> dict1.items()
dict_items([(0, '赞'), (1, '赞'), (2, '赞'), (3, '赞'), (4, '赞'), (5, '赞'), (6, '赞'), (7, '赞'), (8, '赞'), (9, '赞')])

5.get()

提供更宽松的方式去访问字典项,当键不存在的时候,get()方法并不会报错,只是默默地返回了一个None,表示啥都没找到。

>>> dict1.get(9)
'赞'
>>> dict1.get(10)
>>> 

希望找不到数据时返回指定的值,那么可以在第二个参数设置对应的默认值:

>>> dict1.get(10,'木有')
'木有'

不知道一个键是否在字典中,那么可以使用成员资格操作符(in 或 not in)来判断

>>> 11 in dict1
False

在字典中检查键的成员资格比序列更高效。

  • 字典采用的哈希的方法一对一找到成员,而序列则是采取迭代的方式逐个比对。
  • 字典查找的是键不是值,但是在序列中查找的是元素的值而不是元素的索引。

6.clear()

清空一个字典

PS.清空字典跟使用变量名赋值为一个空字典的方法来清空字典是不同的

使用变量名赋值为一个空字典的方法:

>>> a = {'姓名':'小甲鱼'}
>>> b = a
>>> b
{'姓名': '小甲鱼'}
>>> a = {}
>>> a
{}
>>> b
{'姓名': '小甲鱼'}

通过上面的例子,a、b指向同一个字典,然后试图将a重新指向一个空字典来达到清空的效果时,我们发现原来的字典并没有真正清空,只是a指向一个新的空字典而已。

推荐的做法:clear()

>>> a = {'姓名':'小甲鱼'}
>>> b = a
>>> b
{'姓名': '小甲鱼'}
>>> a.clear()
>>> a
{}
>>> b
{}

7.copy()

复制字典

>>> a = {1:'one',2:'two'}
>>> b = a.copy()
>>> id(a)
103233176
>>> id(b)
103251360
>>> a[1] = '我'
>>> a
{1: '我', 2: 'two'}
>>> b
{1: 'one', 2: 'two'}

通过上面的例子,我们可以知道复制字典,新的字典和旧的字典内存地址是不一样的,所以,更改旧的字典时,新的字典没有发生改变。

8.pop()

给定键弹出对应的值

>>> a = {1: 'one', 2: 'two',3:'three'}
>>> a.pop(2)
'two'
>>> a
{1: 'one', 3: 'three'}

9.popitem()

弹出第一个的键值对(项)

>>> a.popitem()
(1, 'one')
>>> a
{2: 'two', 3: 'three'}
  1. update():更新字典
>>> pets = {'米奇':'老鼠','汤姆':'猫','小白':'猪'}
>>> pets.update(小白='狗')
>>> pets
{'小白': '狗', '米奇': '老鼠', '汤姆': '猫'}

​ 收集参数,Python还有另一种收集的方法,就是用两个星号(**)表示。

收集参数的两种打包形式:

  1. 以元组的形式打包
  2. 以字典的形式打包
    以元组的形式打包
>>> def test(** params):
    print('有 %d 个参数'%len(params))
    print('他们分别是:',params)
>>> test(a=1,b=2,c=3)
有 3 个参数
他们分别是: {'a': 1, 'b': 2, 'c': 3}

当参数带有两个星号()时传递给函数的任意个key=value实参会被打包进一个字典中。那么有打包就有解包**,下面有个小demo

>>> a = {'one':1,'two':2,'three':3}
>>> test(**a)
有 3 个参数
他们分别是: {'three': 3, 'one': 1, 'two': 2}

7.2 集合:在我的世界里,你就是唯一

字典的表亲:集合

集合:使用大括号括起来一堆数字但没有体现映射关系

集合在Python中几乎起到作用就是两个字,唯一。(集合会帮我们把重复的数据清理掉)

>>> num ={1,1,2,3,4,4,4,6}
>>> num
{1, 2, 3, 4, 6}

集合是无序的,也就是你不能试图去索引集合中的某一个元素

>>> num[2]
Traceback (most recent call last):
  File "<pyshell#72>", line 1, in <module>
    num[2]
TypeError: 'set' object does not support indexing

7.2.1 创建集合

创建集合方法大全:

  1. 直接把一堆元素用大括号({})括起来
  2. 用set()
>>> set1 = {1,2,3,4,5}
>>> set2 = set([1,2,3,4,5])
>>> set1 == set2
True

要求去掉列表[1,2,3,4,5,5,3,1,0]中的重复的元素。

方法1:

>>> list1 = [1,2,3,4,5,5,3,1,0]
>>> temp = list1[:]
>>> list1.clear()
>>> for each in temp:
    if each not in list1:
        list1.append(each)      
>>> list1
[1, 2, 3, 4, 5, 0]

方法2:

>>> list1 = [1,2,3,4,5,5,3,1,0]
>>> list1 = list(set(list1))
>>> list1
[0, 1, 2, 3, 4, 5]

方法1和方法2得出结果的顺序不同

由于set()创造的集合内部是无序的,所以再调用list()将无序的集合转换成列表就不能保证原来的列表的顺序

PS.使用set()这个函数时,要注意类表中元素的前后顺序的问题

7.2.2 访问集合

访问集合,通过迭代把集合中的数据一个个读取出来:

>>> set1 = {1,2,3,4,5,6}
>>> for each in set1:
    print(each,end='')  
123456

使用in和not in判断一个元素是否在集合中:

>>> 1 in set1
True
>>> 0 in set1
False

add()为集合添加元素

>>> set1.add(7)
>>> set1
{1, 2, 3, 4, 5, 6, 7}

remove()为集合删除元素

>>> set1.remove(6)
>>> set1
{1, 2, 3, 4, 5, 7}

7.2.3 不可变集合

有时希望集合中的数据具有稳定性,像元组一样不能随意增加或删除集合中的元素

定义不可变集合:就是把元素给frozen(冰冻)起来

使用frozenset()

>>> set1 = frozenset({1,2,3,4,5})
>>> set1.add(6)
Traceback (most recent call last):
  File "<pyshell#107>", line 1, in <module>
    set1.add(6)
AttributeError: 'frozenset' object has no attribute 'add'

参考资料是:零基础入门学习Python小甲鱼的书和视频教程

猜你喜欢

转载自blog.csdn.net/xyyojl/article/details/80633289