开发者学堂课程【 Python 开发基础入门:Python 编程核心-Python 字典增删改查】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/556/detail/7657
Python 编程核心-Python 字典增删改查
内容介绍:
一、 字典 dict
二、 字典 dict 定义 初始化
三、 字典元素的访问
四、 字典增加和修改
五、 字典删除
一、 字典 dict
1. 在 java 语言中叫 map,在 python 中叫字典
2. 字典是 key-value 键值对的数据的集合,习惯称为键值对,是数据的集合,这是一个容器,可以装很多东西,但是装的时候需要 key 和一个 Value。
3. 字典是非常重要的数据结构,和列表一样,列表和字符串目前是最重要的数据结构
4. 字符串是一个简单的值,在容器中,list是非常重要的线性结构的东西,而只字典是非线性中最重要的一种,set可以看成是字典的特例
5. 可变的无序的key不重复,不能索引,set是可变的,元素不重复,字典也是可变的,key不重复表示key是去重的,key在集合中只能有一个
二、 字典 dict 定义 初始化
d= dict()或者d= {}(一般用这个)
dict(**kwargs)使用name=value对初始化一个字典
注意:不能写这样:d = dict(‘a’=1)这是错误的,标识符和字符串是不一样的,字符串是不可以复制的,因为他是不可变的
d = dict(a=1,b=2)这样可以运行,查看b的值,结果:
{
‘a’:1,’b’:2}
dict(iterable, **kwarg)使用可迭代对象和name=value对构造字典,不过可迭代对象的元素必须是一个二元结构(二元组或二元列表)
iterable:可迭代对象
d = dict((1,'a'),(2, 'b')))或者
d = dict(([1,'a'][2,'b]))
这是一个可迭代的元组,里面有两个元素,这元素中必须是个二元结构
dict(mapping, **kwarg)使用一个字典构建另一个字典
mapping:映射,用k来映射一个值(从x映射到y)
d = {'a':10, 'b':20, 'c':None, 'd':[1,2,3]}
可以写成这样更加简单
类方法dict.fromkeys(iterable, value)
从一个可迭代对象来做
d = dict.fromkeys(range(5))
fromkeys这个函数在提供key
运行返回一堆空值
d = dict.fromkeys(range(5),0)
运行返回0
标红的为最常用的初始化方式
三、字典元素的访问
d[key]:用k来访问
d = dict.fromkeys(range(5),0)
运行id(d[5])就会报错KeyError
表示这里是一个key,key必须是唯一的
运行d[4] =10000就会替换掉d[4]原本的值
这是通过索引来赋值
返回key对应的值value
key不存在抛出KeyError异常
找到元素才能进赋值
运行d.get(4)得到d[4]的值
运行d.get(6)得到None,如果key不存在,他不会抛异常,而是返回None
get(key[ default])
返回key对应的值value
key不存在返回缺省值(默认值),如果没有设置缺省值就返回None
以上功能看需要进行使用
setdefault(key[ default])
返回key对应的值value
key不存在,添加kv对, value为default ,并返回default ,如果default没有设置,缺省为None
运行d. setdefault(100)无返回
然后运行d
会发现后面已经添加上了100标签,但是没有值
再运行d. setdefault(100,30000)后
d并没有什么改变,因为setdefault是改变的缺省值,但是刚才已经运行一遍了,所以本次并没有运行成功
再次运行运行d. setdefault(101,30000)
就会发现101标签和30000的值已经加上去了
四、 字典增加和修改
d[key] = value
通过key找到元素位置,然后把value
的值传给d,做一个key和value的映射,和列表索引一个道理
将key对应的值修改为value
key不存在添加新的kv对
输入d[102] = 40000就会直接创建新的内容
然后再输入d[102] = 40001,就会替换掉之前的40000
这就是简单的字典的增加和修改
结论:key不存在就创建,key不存在就覆盖
update([other]) -> None
使用另一个字典的kv对更新本字典
key不存在,就添加,相当于同领k赋值
key存在,覆盖已经存在的key对应的值
就地修改
d.update(red=1)
运行将会添加一个value red:1,但是添加的位置不对,他是随机的
d.update(red=1)
d.update('red',2),))
d.update('red':3})
同时运行以三个,因为这是可迭代的,所以得出red值为3
d.update(‘blue’=1)
d.update('blue',2),))
d.update('orange':3})
运行这三个就会得到blue:2,orange:3的值,但是位置还是不对,没在最后,而在中间,所以说字典是无序的,字典的无序体现在key的无序,而set的无序体现在其元素的无序
key 必须是唯一的,但顺序随机
五、字典删除
pop(key[, default])
运行d.pop(‘101’)会报错,因为类型不对
运行d.pop(101)。返回30000代表删除成功,再次运行d查看,发现30000这个值已经被删除
不能直接运行d.pop因为字典是无序的,找不到尾巴在哪,运行将会报错
但是有一个d.popitem()可以实现
key存在,移除它,并返回它的value
key不存在,返回给定的default
default未设置, key不存在则抛出KeyError异常
很少添加default值,一般都是直接pop(key)
popitem()
随机删除一个值
移除并返回一个任意的键值对
字典为empty ,抛出KeyError异常
如有循环移除,一个控制字数
clear()
清空字典
del语句
a = True//这是一个简单变量赋值
b= [6]//列表赋值语句
d= {a':1, 'b': b, 'c':[1,3,5]}//字典赋值语句
运行以上三个返回[100]
运行del a
这样a和true值的关系就被删除了,再次访问a就找不到会报错
然后再次删除b:del b,运行之后访问b就会找不到了
删除d:del d 发现运行成功,返回:
{‘a’:1,’b’=[6],’c’=[1,3,5]}
然后运行id(b),id(d[‘b’]),结果为:
84577224,84577224
得出结果,两个地址一模一样
所以删除了b,还有d[‘b’]会得到b的值
运行del d[‘c‘],相当于删除了这个引用计数,清掉了kv对,所以k和v就解除关系了,再次运行d就访问不到c的value了
del d['c'] #删除了一个对象[1,3,5] ?
del b[0]//运行是删除的列表元素
再次访问b,返回:
{‘a’:1,’b’=[] }
c= b//把b的地址拿给c
del C//相当于删除c的标识符
删除时必须搞清楚地址,是谁引用谁的,不然会删除失败
del b
b= d[b']
del a['c]看着像删除了一个对象,本质上减少了一个对象的引用, del实际上删除的是名称(他的标识符),而不是对象