找回密码
 注册
关于网站域名变更的通知
查看: 313|回复: 1
打印 上一主题 下一主题

给深度学习入门者的Python快速教程基础篇之 字典

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2018-11-19 09:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
给深度学习入门者的Python快速教程基础篇之 字典
1 ]0 ?3 w& i2 @
字典
' C8 D# W& d- y! e  R( d
% C# c7 u8 M5 `1 \字典是一种非常常见的“键-值”(key-value)映射结构,键无重复,一个键不能对应多个值,不过多个键可以指向一个值。还是通过例子来了解,构建一个名字->年龄的字典,并执行一些常见操作:) m4 j5 N- d* Q% Y& Q  [( @; {, h- D
a = {'Tom': 8, 'Jerry': 7}
0 \% ~( z; z: D+ t2 g3 d- sprint(a['Tom']) # 8
9 Q1 B3 Q8 }2 hb = dict(Tom=8, Jerry=7) # 一种字符串作为键更方便的初始化方式
0 [0 W1 o" k) _/ Wprint(b['Tom']) # 8
5 ?" f, ?; H' m% H4 n, yif 'Jerry' in a: # 判断'Jerry'是否在keys里面
% Z9 o& |$ S; h* J/ uprint(a['Jerry']) # 7
4 F" G( j8 `6 g$ ?" nprint(a.get('Spike')) # None,通过get获得值,即使键不存在也不会报异常
+ z$ i8 d& k4 v8 C' Fa['Spike'] = 10- s$ R. d: ^3 @  N: t
a['Tyke'] = 3
1 @4 R, a8 \7 a6 }! ya.update({'Tuffy': 2, 'Mammy Two Shoes': 42})
0 p1 \  z3 i6 G) i7 ~print(a.values()) # dict_values([8, 2, 3, 7, 10, 42])
2 z* S; p; F! B2 x% g# Tprint(a.pop('Mammy Two Shoes')) # 移除'Mammy Two Shoes'的键值对,并返回42
, B4 J7 @( |6 }7 f' {$ e8 u! t* T! q. o" Kprint(a.keys()) # dict_keys(['Tom', 'Tuffy', 'Tyke', 'Jerry', 'Spike'])
1 g, p# e2 J' R; y5 q" a7 y0 f6 u+ ^! K$ z( N5 n) S( {" x% J
注意到初始化字典和集合很像,的确如此,集合就像是没有值只有键的字典。既然有了人名到年龄的映射,也许你立马想到是否可以给字典排序?在Python3.6之前,这个问题是错误的,字典是一种映射关系,没有顺序。当然了,如果要把(键, 值)的这种对进行排序,是没有问题的,前提是先把字典转化成可排序的结构,items()或者iteritems()可以做到这件事,接上段代码继续:4 r7 m7 c! A+ _# o
b = a.items()
/ E4 O) g! q7 [! i7 T( l* Aprint(b) # [('Tuffy', 2), ('Spike', 10), ('Tom', 8), ('Tyke', 3), ('Jerry', 7)]
% ~% ?- \, \( vfrom operator import itemgetter
) h, j9 k, r4 V5 L# K. |c = sorted(a.items(), key=itemgetter(1))
  n9 Q, L9 k& i) D7 N- uprint(c) # [('Tuffy', 2), ('Tyke', 3), ('Jerry', 7), ('Tom', 8), ('Spike', 10)]
4 u5 |0 o$ L( D% X5 dd = sorted(a.iteritems(), key=itemgetter(1))& @9 T( s( a) @3 D+ _
print(d) # [('Tuffy', 2), ('Tyke', 3), ('Jerry', 7), ('Tom', 8), ('Spike', 10)]
9 H- O) K0 {/ Q; ze = sorted(a)
: n# }! x( ~! ?- B, ~4 z# B  h  F: sprint(e) # 只对键排序,['Jerry', 'Spike', 'Tom', 'Tuffy', 'Tyke']: M8 R! P) j5 l% T. E8 G
. {8 D8 I1 z. r( p' L! Y" t& c
items()可以把字典中的键值对转化成一个列表,其中每个元素是一个tuple,tuple的第一个元素是键,第二个元素是值。变量c是按照值排序,所以需要一个操作符itemgetter,去位置为1的元素作为排序参考,如果直接对字典排序,则其实相当于只是对键排序。字典被当作一个普通的可遍历结构使用时,都相当于遍历字典的键。如果觉得字典没有顺序不方便,可以考虑使用OrderedDict,使用方式如下:
' D: `- @* s: p$ ufrom collections import OrderedDict. l0 o; w4 w4 ?3 g
a = {1: 2, 3: 4, 5: 6, 7: 8, 9: 10}9 U6 k! q8 \$ u' T- n! r
b = OrderedDict({1: 2, 3: 4, 5: 6, 7: 8, 9: 10})
2 x$ T6 m9 K  J' o( i2 Uprint(a) # {1: 2, 3: 4, 9: 10, 5: 6, 7: 8}' f  g/ n4 O' E. ^. e: i' z6 u+ ]
print(b) # OrderedDict([(1, 2), (3, 4), (9, 10), (5, 6), (7, 8)])# r% D' s) K3 o6 U" a1 b
2 B5 D! Q- l( f0 A+ Q
这样初始化时的顺序就保留了,除了有序的特性以外,用法上和字典没有区别。2016年9月,Guido宣布在Python3.6中,字典将默认有序,这样就不用纠结了。另外需要注意的一点是字典是通过哈希表实现的,所以键必须是可哈希的, list不能被哈希,所以也不能作为字典的键,而tuple就可以。
' k& m$ ?, y  J, `
4 L3 T  K* @2 p" a+ I因为上上段代码中用到了iteritems(),所以这里顺带提一下迭代器(iterator),迭代器相当于一个函数,每次调用都返回下一个元素,从遍历的角度来看就和列表没有区别了。iteritems()就是一个迭代器,所以效果一样,区别是迭代器占用更少内存,因为不需要一上来就生成整个列表。一般来说,如果只需要遍历一次,用迭代器是更好的选择,若是要多次频繁从一个可遍历结构中取值,且内存够,则直接生成整个列表会更好。当然,用迭代器生成一个完整列表并不麻烦,所以有个趋势是把迭代器作为默认的可遍历方式,比如前面我们使用过用来生成等差数列列表的range(),在Python2中对应的迭代器形式是xrange()。在Python3中,range()就不再产生一个列表了,而是作为迭代器,xrange()直接没了。

2 S" S7 d+ Q* J
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-7-23 10:41 , Processed in 0.125000 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表