开发者学堂课程【Python 开发基础入门:Python 字典遍历、缺省字典、有序字典实战】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/556/detail/7658
Python 字典遍历、缺省字典、有序字典实战
内容介绍:
一、字典简介
二、字典遍历
三、字典遍历和移除
四、字典的key
五、Defaultdict
六、OrderedDict
七、字典练习
一、字典简介
d=dict()或者d{}
dict(**kwargs)使用name=value对初始化一个字典
dict(iterable,*kwarg)使用可迭代对象和name=value对构造字典,不过可迭代对象的元素必须是一结构
d = dict(((1,'a'),(2,'b')))或者d-= dict(([1,'a'],[2,'b']))
dict(mapping, **kwarg)使用一个字典构建另一个字典
d = {'a':10, 'b':20, 'c':None, 'd":[1,2.3])
类方法dict.fromkeys(iterable, value)
d = dict.fromkeys(range(5))
d = dict.fromkeys(range(5),0)
注:红色标记部分是较为常用的
字典元素的访问:
d[key]
返回key对应的值value
key不存在抛出KeyError异常
get(keyL, default])
返回key对应的值value
key不存在返回缺省值,如果没有设置缺省值就返回None
setdefault(key[, default])
//setdifault 使用的相对较少
返回key对应的值value
key不存在,添加kv对,value为default,并返回default,如果default没有设置,缺省为None
字典元素的增加:
d[key] = value
将key对应的值修改为value
key不存在添加新的kv对
update([other]) -> None
使用另一个字典的kv对更新本字典
key不存在,就添加
key存在,覆盖已经存在的key对应的值
就地修改
d.update(red=1)
d.update((('red" ,2).))
d.update(['red':3)
字典的删除:
pop(keyL, default])
key存在,移除它,并返回它的value
key不存在,返回给定的default
default未设置,key不存在则抛出KeyError异
popitem()
移除并返回一个任意的键值对
字典为empty,抛出KeyError异常
clear()
//需要考虑垃圾回收的问题
清空字典
del语句
a = Trueb=[6]
d = ('a : 1, 'b: b, 'c':[1,3,5]}
del a
del d['c']#删除了一个对象[1,3,5]?
del b[0]
c=bdel cdel b
b = d['b']
del a[c]看着像删除了一个对象,本质上减少了一个对象的引用,del 实际上删除的是名称,而不是对象
二、字典遍历
for ... in dict
遍历value
forkind:
prin
t(d
[k
]
)
for k in d.keys():
print(d.get(k))
for v in d.values():
print(v)
实操演示:
d
{ 'a ': 1,'b': [], 'c': 200 }
d [ 'c'] = 200
for i in d:
print (i)
a
cb
for i in d.keys ( ) :
print (i)
a
cb
注意:一个常见的错误
分析:书写不规范导致报错,注意书写规范即可
//对以上错误代码进行以下调整即可
d[ ( 'd' ,300) ] = 300
for i,v in d:
print (i)
D
//上面的这种写法与下面的写法是等价的,效果是相同的
for i in d.keys ():
print (i)
//这两种写法拿到的都是key
D[(
‘
d
’
,300)] = 300
For i,v in d:
Print(i)
D
for val in d.values () :
print (val)
300
1200[ ]
for key in d.keys () :
print (d [ key])
/
/
items方法取值
for val in d.values () :
print (val)
300
1200[ ]
for key in d.keys () :
print (d [ key])
总结:
Python3 中,keys、values、 items 方法返回一 个类似一个生成器的可迭代对象 ,不会把函数的返回结果复制到内存中.
Dictionary view对象
字典的 entry 的动态的视图,字典变化,视图将反映出这些变化
Python2中,上面的方法会返回一一个新的列表,占据新的内存空间。
所以 Python2 建议使用 iterkeys、itervalues、iteritems 版本 ,返回一个迭代器,而不是一个 copy
//迭代器部分代码展示
for k in d:
print (k)
d.pop (k)
(
'd', 300)
//出现运行异常的报错
//正确的做法是
while len (d):
d.popitem()
lst = []
for k in d.keys ():
print (k)
if isinstance (d[k], str) :
lst.append (k)
for k in lst:
d.pop (k)# okT
{ }
三、字典遍历和移除
如何在遍历的时候移除元素
1. 错误的做法
d = dict(a=1, b=2, c='abc')
for k,v in d.items():
d.pop(k) #异常
while len(d): #相当于清空,不如直接clear()
print(d.popitem()
2. 正确的做法
d- dict(a=1, b=2, c='abc')
keys.=0
for k,v in d.items():
if isinstance(v, str):
keys.append(k)
for k in keys:
四、字典的 key
key 的要求和 set 的元素要求一致
set 的元素可以就是看做 key,set 可以看做 dict 的简化版
hashable 可哈希才可以作为 key,可以使用 hash() 测试
d= {1:0, 2.0:3, "abc": None, (hello', 'world', python'): "string", b'abc' : '135'}
五、defaultdict
collections.defaultdict([default_ factory[, .]
第一个参数是 default._factory ,缺省是 None,它提供一个初始化函数。
当 key 不存在的时候,会调用这个工厂函数来生成 key 对应的 value
import random
d1= {}
for k in 'abcdef':
for i in range(random.randint(1,5)):
if k not in d1.keys():
d1[k]= 0]
d1[k].append(i)
print(d1)
from collections import defaultdict
import random
d1 = defaultdict(list)
for k in 'abcdef':
for i in range(random.randint(1,5)):
d1[k].append()
print(d1)
实操演示:
import random
d = { }
for c in ' abcde ' :
for i in range (5) :
if not d.get (c) :
d[c] = []
d[c].append (i)
p
rint(d)
{ 'e ' : [0],'d ' : [0,1,2,3,4],'a': [0],'c':[0,1,2],'b': [0,1,2]})
import random
from collections import defaultdict
#d = { }
d = defaultdict (list)for c in ' abcde ' :
for i in range (random.randint (1,5)) :
d ic].append (i)
print (d)
defaultdict(,{'e ': [0,1,2,3,4], 'd': [0,1,2,3],
' a' :[ o, 1,2], 'c' :
[ 0],'b': [0,1]})
$cd magedu/projects/test/
$
python
$
pyenv local 3.6.3
$
python -v
$
ipython
$
pip -v
>
>>d = {}
>
>>d = dict(a=1,b=2,c=3,d=400)
>
>>d
{
‘a’:1,’b’:2,’c’:3,’d’:400}
>>>d [100] = ‘abc’
>
>>d
{
‘a’:1,100:’abc’,’d’:100,’b’:2,’c’:3}
>>>d[0]=’abc’
>
>>d
{
0:’abc’,’d’:2,’c’:3,’d’:400,100:’abc’,0:’abc’}
>>>
from collections import OrderedDict
od = OrderedDict (a=1,b=2,c=3, d=4)
od [100] = 100
od[0] = 0
od
orderedDict( [ ('d ',4),('a ',1),( 'c',3),('b',2),(100,100),(0,0)])
六、OrderedDict
collections.OrderedDict([items])
key并不是按照加入的顺序排列正可以使用OrderedDict记录顺序
from collections import OrderedDict
import random
d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
print(d)
keys = list(d.keys()
random.shuffle(keys)
print(keys)
od = OrderedDict()
for key in keys:
od[key] = d[key]
print(od)
print(od.keys0)
有序字典可以记录元素插入的顺序,打印的时候也是按照这个顺序输出打印
3.6版本的 Python 的字典就是记录 key 插入的顺序( IPython不一定有效果)
应用场景:
假如使用字典记录了N个产品,这些产品使用ID由小到大加入到字典中
除了使用字典检索的遍历,有时候需要取出ID,但是希望是按照输入的顺序,因为输入顺序是有序的
否则还需要重新把遍历到的值排序
七、字典练习
字典练习
用户输入一个数字
打印每一位数字及其重复的次数
数字重复统计
随机产生100个整数
数字的范围[-1000, 1000]
升序输出所有不同的数字及其重复的次数
字符串重复统计
字符表abcdefghijklmnopqrstuvwxyz'
随机挑选2个字母组成字符串,共挑选100个
降序输出所有不同的字符串及重复的次数
八、字典 key
key 的要求和 set 的元素要求一致
set 的元素可以就是看做 key , set 可以看做 dict 的简化版
hashable 可哈希才可以作为 key,可以使用 hash()测试
d={1:0,2.0:3, "abc": None, ('hello 'world , python') : "string", b'abc': '1353