12.3-字典遍历和删除注意事项

梦想最大的意义,并不在于,你最终是否去实现了它。而是它赐予你信心,带给你希望,给予你力量。不是现实支撑了你的梦想,而是你的梦想支撑了现实。


图片.png

用好字典的关键在于Key(set)
字典不会用,基本就不会编程,字典非常重要;

可变类型与不可变类型

可变类型:值可以改变:
列表list
字典dict
不可变类型:值不可以改变:
数值类型int, long, bool, float
字符串str
元组tuple

字典

总结:

  1. Python3中,字典keys\values\items 方法返回一个类似一个生成器的可迭代对象;不会把函数的返回结果复制到内存中;不会产生内存copy,节省内存空间;
    d={}
    type(d.items()) # dict_items([])
  2. Python2中,上面的方法返回一个新的列表,占据新的内存空间,所以Python2建议使用iterkeys、

3.用好字典的关键在于Key

1.字典中的元素访问--三种方式
字典的key

1.key的要求和set的元素要求一致;
2.set的元素可以看做key,set可以看做dict的简化版;
3.hashable 可哈希才可以作为key, 可以使用hash() 测试;

  • d[key]
    key不存在返回KeyError ;
  • get(key[,default])
    key不存在返回缺省值,没有设置返回缺省值;
  • setdefault(key[,default])
    key不存在,添加KV对,value为default,没有设置返回缺省值;
2.访问字典

# 返回一个键的列表
dict1.keys()  
['name','age']

# 返回一个值的列表
dict1.values()  
['linda',13]

# 返回一个包含(键,值)元组的列表
dict1.items() 
[('name','linda'),('age':13)]

# 返回键name对应的值
dict1['name'] 
'linda'

# 得到键的值,若键不存在,则返回默认值
dict1.get('name',None) 
'linda'


# 字典中没有sex,返回默认值man
dict1.get('sex','man') 
'man'

dict.iter()  #方法 iteritems(), iterkeys(), itervalues()与它们对应的非迭代方法一样,不同的是它们返回一个迭代子,而不是一个列表。
2.字典的删除;
  • pop(key[key,default])**
    key 存在,移除它,返回它的value;
    key不存在返回default ;
    default未设置,Key不存在则抛出KeyError异常;
  • popitem() 随机删除,没有任何文档表示它的删除有规律
    返回要移除的 一个任意的键值对;
    字典为empty,抛出KeyError 异常;
  • clear()
    清空字典
2.1 字典循环移除元素——移除字典中值为字符串的一项

2.1 字典元素的删除操作——del、pop

2.2 循环内增加、删除value时不允许的;pop会在循环内报错;但单独增删key ;

正确的做法:字典元素的删除——删除key;
keys = []

#直接增删是不允许的,因为 dict 长度是不允许改变的;
for k in d2.keys():
    if k % 2:
        keys.append(k)
       
正确的做法:字典元素的删除——删除key; 
for k in keys:
    d2.pop(k)

---------------------------------------
for k in d.keys():
    print(k)
    if isinstance(d[k],str):
        lst.append(k)
d.pop(lst[0])
d
总结:
1.循环内增加、删除value时不允许的;pop会在循环内报错;
2. del a['c'] 看着像删除了一个对象,本质上是减少了一个对象的引用,del 实际上删除的是名称,而不是对象;


3.字典的遍历\访问;

使用for key, value in dict.items()可以遍历整个字典。如果你只喜欢遍历键名或值,你可以只使用for key in dict.keys()或 for value in dict.values()。

# 1. 遍历 keys-value 
for key, value in d1.items():
    print("{}->{}".format(key, value))
for key, _ in d1.items():   #丢弃一项;
    print(key)

# 2. 遍历key
for key in d1.keys():
    print(key,type(key))     # str  / int  
for k in d:
  print(d[k])

# 3. 遍历value
for value in d1.values():
    print(value)

# 4. 遍历item,即kv对;
for item in d.items():
  print(item)
  print(item[0],item[1])

5. 通用写法:一般不会出现异常;
for k in d:    #  遍历输出的是字典的keys  ;
  print(d[k])


3.2 对字典的遍历默认遍历的是 key ;

1.对字典的遍历都是遍历的 key ;
# 形式1
d = {1: 2000, 2: 0, 3: 0, 4: 0, 5: 0, 6: 0, 7: 0, 8: 0, 9: 0, 'b': 3000}
for i in d:
    print(i)
----------------------------
1
2
3
4
5
6
7
8
9
b

# 形式2
for k in d.keys():
set(d)
list(d)   、list(d.keys())

for k in d:     # 增加元素; dictionary changed size during iteration;
    d['a00']=100 

values 表示:   d.get[k]
4.字典的内置方法
序号 函数及描述
1 len(dict) 计算字典元素个数,即键的总数。
2 str(dict) 输出字典可打印的字符串表示。
3 type(variable) 返回输入的变量类型,如果变量是字典就返回字典类型。
5.缺省字典 collections.defaultdict([default_factory[,...]])

第一个参数时default_factory,缺省为None,它提供一个初始化的函数,当key不存在的时候,这个工厂函数来生成key对应的value

方法1:
import random
from collections import defaultdict

d=defaultdict(list)
for c in 'abcde':
    for i in range(random.randint(1,5)):
        if d[c] not in d:
            d[c]=[]
        d[c].append(i)
print(d)

方法2,3:
import random

d={}
for c in 'abcde':
    for i in range(random.randint(1,5)):
        if not d.get(c):     #  if c not in d.keys():
            d[c]=[]
        d[c].append(i)
print(d)
总结:
1.
import random
from collections import defaultdict

d=defaultdict(list)   
#等价于 d[c]=[]
if d[c] not in d:
    d[c]=[]

总结
1.缺省字典中很多源码都在用;
2.字典为空dict 时,append会报错;缺省字典相当于添加一个空list ;
5.有序字典 OrderedDict (3.6.3版本才出现的;Ipython不会显示;原生Python才行)

记录Key插入的顺序;

# 有序字典的创建;
from collections import OrderedDict
d1 = OrderedDict()

d = {}
d['Tom']='A'
d['Jack']='B'
d['Leo']='C'
d['Alex']='D'
print('无序字典(dict):')
for k,v in d.items():
    print(k,v)

d1 = OrderedDict()   # 保证写入顺序
d1['Tom']='A'
d1['Jack']='B'
d1['Leo']='C'
d1['Alex']='D'
print('\n有序字典(OrderedDict):')
for k,v in d1.items():
    print(k,v)
---------------------------------
无序字典(dict):
Leo C
Jack B
Tom A
Alex D

有序字典(OrderedDict):
Tom A
Jack B
Leo C
Alex D
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容