|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 Python初学者8号 于 2021-9-22 09:25 编辑
2021年9月15日17:48:39
小甲鱼也是分开讲的,这个数据结构有点区别。主要在于不是用数字index来索引的,是一种二元的具有映射关系的特殊的数据结构。
我寻思这个和之前的sequence的区别主要还是数据结构的底层吧,当然还是根据需要来的。这个有点像是C中的那个“结构体”?
总之字典的特点就是具有映射关系的二元数组
字典
顾名思义,这个名字已经很形象,就是一个字符(或者是一个不可变对象)对应一个内容(value)
1.定义
按照形式来 :键 —— 值- dictionnary = {key1 = values1 , key2 = values2, key3 = values3 , key4 = values4, key5 = values5}
复制代码
2.创建
创建方式同sequence那样,符号和函数两种方式
符号就是{}函数是,dict()。这个方法很好用,根据字典的二维映射数组的特点可以有这几种方法创建
2.1 定义法
- a={'a': 1, 'b': 2, 'c': 3, 'd': 4}
复制代码
2.2 赋值法- a= dict(a = 1, b =2, c=3, d=4)
复制代码 注意千万不能是加上了引号。其实这个才是最方便直接打出一个随意的字典的,因为按照定义的来话就很麻烦- >>> a = dict(<font color="#ff0000">'</font>a<font color="#ff0000">'</font>=1,'b'= 2,'c'= 3,'d'= 4)
- File "<pyshell>", line 1
- SyntaxError: expression cannot contain assignment, perhaps you meant "=="?
复制代码
2.3 二维序列法
或者是二维列表,或者是二维的元组。
- >>> c = dict([('abandon',1),('adam',2),('alex',3),('ape',4)])
复制代码- >>> b= dict((('abandon',1),('adam',2),('alex',3),('ape',4)))
复制代码 注意,这是要加引号的!
- <font color="#ff0000">不加引号就出错</font>
复制代码
2.4 zip()方法
是这个方法也是一种映射啊,和字典很相似了其实,
- <font color="#ff0000">先定义一个zip对象</font>
- >>> z1=('we','will','rock','you')
- >>> z2 = (1,2,3,4)
- >>> z3 = zip(z1,z2)
- >>> z3
- <zip object at 0x000001C1F339E400>
- >>> for i in z3:
- print (i)
-
- ('we', 1)
- ('will', 2)
- ('rock', 3)
- ('you', 4)
复制代码 然后再来
- >>> d = dict(z3)
- >>> d
- {}
- >>> d = dict(zip(z1,z2))
- >>> d
- {'we': 1, 'will': 2, 'rock': 3, 'you': 4}
复制代码 我们可以看到,很明显,d = dict(z3),这是错的,这是因为这z3只是单个元素,他不像是二维列表和元组那样直观的可以显示,他应该是一种更加复杂的数据结构吧?
2021年9月16日09:55:54更正上面的说法,实际上来说,dict(z3)是可行的,为什么不可行,可能是和我在shell中运行有关吧还有一个必须指出的是,zip不仅仅可以映射一对数据,可以映射好几对!!就像是矩阵或者是数表一样!!估计这样才是他不能像是字典一样显示的原因吧?- z1=('we','will','rock','you')
- z2 = (1,2,3,4)
- z3 = ('one','two','three','four')
- z = zip(z1,z2,z3)
复制代码- >>> z
- <zip object at 0x000002E95F2F6780>
- >>> for i in z:
- print(i)
-
- ('we', 1, 'one')
- ('will', 2, 'two')
- ('rock', 3, 'three')
- ('you', 4, 'four')
复制代码 并且,这里还要插一嘴提到了迭代器的一些特点- >>> z1=('we','will','rock','you')
- >>> z2 = (1,2,3,4)
- >>> z3 = zip(z1,z2)
- >>> d = dict(z3)
- >>> d
- {'we': 1, 'will': 2, 'rock': 3, 'you': 4}
- >>> for i in z3:
- print(i)
-
- >>> d
- {'we': 1, 'will': 2, 'rock': 3, 'you': 4}
- >>> e = dict(z3)
- >>> e
- {}
复制代码逃兵 发表于 2021-9-16 10:10
迭代器就像枪里的子弹
按照你上膛的顺序(有序)
打一发少一发(有量)
总结:还是赋值法在自己随意创建的时候最简单,因为不用写引号; 如果是像是电话本那样的话,还是二维序列法简单: 如果是两个同纬度向量就是选择zip咯!!!看看官方文档
| dict() -> new empty dictionary
| dict(mapping) -> new dictionary initialized from a mapping object's
| (key, value) pairs
| dict(iterable) -> new dictionary initialized as if via:
| d = {}
| for k, v in iterable:
| d[k] = v
| dict(**kwargs) -> new dictionary initialized with the name=value pairs
| in the keyword argument list. For example: dict(one=1, two=2)
3.访问
不再是index,而是key访问,方法很像,就是dic[key]
还有一种方法,针对dic[key]的问题来的:dic[key]的问题在于如果找不到回报错出来KeyError。有些场合为了不报错就可以用这个get()方法
get()方法也是参数为key,找不到就是直接给出一个默认值,而这个默认值可以修改的(默认参数哦!!)
- >>> d.get('2','没有啊大哥!!!')
- '没有啊大哥!!!'
- >>> type(d.get('2','没有啊大哥!!!'))
- <class 'str'>
复制代码
当然同样可以使用in 还有 not in 的方法来间接查询
4.运算
包括添加,删除,修改,
- >>> d
- {'we': 1, 'will': 2, 'rock': 3, 'you': 4}
复制代码 添加可以直接使用dic[新的keys] = 新的value;或者是使用update()方法
- >>> d['!']=5
- >>> d
- {'we': 1, 'will': 2, 'rock': 3, 'you': 4, '!': 5}
复制代码 如果想添加很多个的话,就像extend列表一样,可以使用update方法。
- >>> a.update(("e",5))
- Traceback (most recent call last):
- File "<pyshell>", line 1, in <module>
- ValueError: dictionary update sequence element #0 has length 1; 2 is required
- >>> a.update("e",5)
- Traceback (most recent call last):
- File "<pyshell>", line 1, in <module>
- TypeError: update expected at most 1 argument, got 2
复制代码- <font color="#ff0000">该方法的参数只有一个,是个字典(这点和extend 的列表方法是一样的)</font>
- [code]>>> ls.extend([111,222])
- >>> ls.extend(111,222)
- Traceback (most recent call last):
- File "<pyshell>", line 1, in <module>
- TypeError: extend() takes exactly one argument (2 given)
复制代码 正确的方法是这个,并且其id不会变哦!!同样的,同extend一样,这两个修改方法本身并没有返回值- <font color="#ff0000">>>>d.update({'!':5})</font>
复制代码
删除就是直接del dic[keys]
- >>> del d['!']
- >>> d
- {'we': 1, 'will': 2, 'rock': 3, 'you': 4}
复制代码 修改就直接赋值就可以了 dic[keys] = value; 必须指出的是,key是不可修改的!!!我想将you改为U就不行,只能新建一个!!这个点字典时介于列表的可变性和元组的不可变性之间的
- >>> d['you']=100
- >>> d
- {'we': 1, 'will': 2, 'rock': 3, 'you': 100}
复制代码
5.方法主要的方法啊,不是很多,我们需要单独得到其key以及其value;
- >>> d
- {'we': 1, 'will': 2, 'rock': 3, 'you': 4, '!': 5, '?': 6}
复制代码 1. keys
- >>> d.keys()
- dict_keys(['we', 'will', 'rock', 'you', '!', '?'])
复制代码 其类型很像是列表啊,但是不是列表,也很像zip一样是可迭代对象
- >>> dk =d.keys()
- >>> type(dk)
- <class 'dict_keys'>
- >>> for i in dk :
- print(i)
-
- we
- will
- rock
- you
- !
- ?
复制代码 2.value- >>> d.values()
- dict_values([1, 2, 3, 4, 5, 6])
复制代码 返回值也是迭代对象- >>> dv= d.values()
- >>> type(dv)
- <class 'dict_values'>
- >>> for i in dv :
- print(i)
-
- 1
- 2
- 3
- 4
- 5
- 6
复制代码 3.items当然还有像是反用dict(zip())一样得到一个键值对的;- >>> di = d.items()
- >>> di
- dict_items([('we', 1), ('will', 2), ('rock', 3), ('you', 4), ('!', 5), ('?', 6)])
复制代码 这个就很像是zip咯!!
- >>> type(di)
- <class 'dict_items'>
- >>> for i in di:
- print(i)
-
- ('we', 1)
- ('will', 2)
- ('rock', 3)
- ('you', 4)
- ('!', 5)
- ('?', 6)
- >>>
复制代码
4.clear
当然还有清空这中操作( 没错!!列表也有这个方法!);
- >>> c
- {'abandon': 1, 'adam': 2, 'alex': 3, 'ape': 4}
- >>> c.clear()
- >>>
- >>> c
- {}
复制代码 其实没学这个之前,比如一个列表,我们要清空都是直接将list=[]这样的赋值方式换一个指向罢了。但是这个方法对于字典来说,存在数据的危险,毕竟在内存中,虽然指向没有了,但是数据可能是存在的,于是为了数据的安全还是开发了clear的方法,而列表也是有的
插一嘴,lsit强制转换字典以及上述的可迭代对象会发生什么呢?
- >>> cc = list(a)
- >>> cc
- ['a', 'b', 'c', 'd']
- >>> cc.clear()
- >>> cc
- []
复制代码- >>> dil = list(di)
- >>> dil
- [('we', 1), ('will', 2), ('rock', 3), ('you', 4), ('!', 5), ('?', 6)]
- >>> dkl = list(dk)
- >>> dkl
- ['we', 'will', 'rock', 'you', '!', '?']
复制代码 5.copy
当然离不开复制方法拉,这是浅复制的,id是会变的——真假美猴王!
6.pop和popitem | pop(...) | D.pop(k[,d]) -> v, remove specified key and return the corresponding value. | If key is not found, d is returned if given, otherwise KeyError is raised | | popitem(self, /) | Remove and return a (key, value) pair as a 2-tuple. | | Pairs are returned in LIFO (last-in, first-out) order. | Raises KeyError if the dict is empty.
pop的这个用法很像是get啊
- >>> a.pop('c','no!!')
- 'no!!'
- >>> a.pop('c')
- Traceback (most recent call last):
- File "<pyshell>", line 1, in <module>
- KeyError: 'c'
复制代码 然后这个
返回值
返回一个键值对(key,value)形式,按照 LIFO(Last In First Out 后进先出法) 顺序规则,即最末尾的键值对。
实例
以下实例展示了 popitem() 方法的使用方法:
实例
#!/usr/bin/python3
site= {'name': '菜鸟教程', 'alexa': 10000, 'url': 'www.runoob.com'}
pop_obj=site.popitem()
print(pop_obj)
print(site)
输出结果为:
('url', 'www.runoob.com')
{'name': '菜鸟教程', 'alexa': 10000}
|
|