ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、视频、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
字典 --------- 是 iterable,但不是序列 #### 字典的有序性? python2 中字典无序 python3.6 中至少cpython的dict实现细节有序,但并非语言功能,不应被依赖 python3.7中,dict有序成为语言功能,可依赖 #### dict vs list dict:查找和插入的速度极快,不会随着key的增加而变慢,但内存占用大 list:查找和插入的时间随着元素的增加而增加,内存占用小 key ----- - key唯一,不可变。 - key只能取值不可变对象,如:str、types、tuple、数字、bool、None - key取值可变对象时报错! - key取值bool、None:True和False会被当做1、0处理,None仍是None - key重复出现,则后面值覆盖前面值 - 读取字典时,key不存在则报错! ~~~ {[]:1} # 报错!key不可变 {}['foo'] # 报错!key不存在 {b'123':111, (1,2):222, -1.2e-3:333} {1:111, True:222, 0:333, None:444} # {1: 222, 0: 333, None: 444} ~~~ 增删改查 --------- 增: ~~~ d[k] = value D.update() ~~~ 删: ~~~ del d[k1], d[k2]... D.clear() D.pop(k[,d]) D.popitem() ~~~ 改: ~~~ if k in d: d[k] = value d.setdefault(k[,d]) ~~~ 查: ~~~ if k in d: d[k] d.get(k[,d]) ~~~ dict 函数/方法 ---------------- `len()` `str()` ### ---- 增 ---- #### update() ~~~ D.update([E, ]**F) -> None. Update D from dict/iterable E and F. If E is present and has a .keys() method, then does: for k in E: D[k] = E[k] If E is present and lacks a .keys() method, then does: for k, v in E: D[k] = v In either case, this is followed by: for k in F: D[k] = F[k] ~~~ - `D.update()`只接受一个参数:字典或类L.items()型数据(如 [(1, 111), (2, 222)]) ~~~ d = {1:11, 2:22} l = [(1, 111), (3, 333)] d.update(l) d # {1: 111, 2: 22, 3: 333} ~~~ ### ---- 删 ---- #### del - del var1[,var2[,var3[....,varN]]]] -- 删除单个或多个对象的引用 - del 是语句,而不是函数或方法 ~~~ d = {1:11, 2:22} del d[1], d[2] ~~~ #### clear() ~~~ D.clear() -> None. Remove all items from D. ~~~ ~~~ d = {1:11, 2:22} d.clear() d # {} ~~~ #### pop() ~~~ D.pop(k[,d]) -> v ~~~ - k存在:返回其对应值 - k不存在:d不为空则返回d,否则报错! ~~~ d = {1:11, 2:22} d.pop() # 报错!至少一个参数 d.pop(1) # 11 d.pop(3) # 报错! d.pop(3, 33) # 33 ~~~ #### popitem() ~~~ D.popitem() -> (k, v) -- 随机返回并删除字典中的一对键和值 ~~~ - dict为空则报错 ~~~ {}.popitem() {1:11, 2:22}.popitem() ~~~ ### ---- 改 ---- #### setdefault() ~~~ D.setdefault(k[,d]) ~~~ D.get(k,d), also set D[k]=d if k not in D,d默认None ~~~ l = {1:11, 2:22} l.setdefault(3) l # {1:11, 2:22, 3:None} l.setdefault(4, 44) # {1:11, 2:22, 3:None, 4:44} ~~~ ### ---- 查 ---- #### get() ~~~ D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None. ~~~ ~~~ l = {1:11, 2:22} l.get(1) # 11 l.get(3) # None l.get(3, 33) # 33 ~~~ ### ---- 检测 ---- #### in ~~~ 1 in {1:11, 2:22} # True ~~~ ### ---- 迭代 ---- `keys()` `values()` `items()` ~~~ dict = { 1 : 2, 'a' : 'b', 'hello' : 'world' } dict.keys() # ['a', 1, 'hello'] dict.values() # ['b', 2, 'world'] dict.items() # [('a', 'b'), (1, 2), ('hello', 'world')] ~~~ ### ---- 拷贝 & 创建 ---- `D.copy()` `copy.copy()` `copy.deepcopy()` -- 深拷贝 ~~~ d = {1:11, 2:22} d1 = d.copy() import copy d2 = copy.copy(d) ~~~ #### fromkeys() ~~~ fromkeys(iterable, value=None, /) method of builtins.type instance ~~~ - 以iterable元素为key创建新dict,value初始值默认为None ~~~ dict.fromkeys((1,2)) # {1: None, 2: None} ''.fromkeys((1,2)) # {1: None, 2: None} {'a':'A'}.fromkeys((1,2)) # {1: None, 2: None} dict.fromkeys((1, 2), 'foo') # {1: 'foo', 2: 'foo'} ~~~