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

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

[复制链接]

该用户从未签到

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

EDA365欢迎您登录!

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

x
给深度学习入门者的Python快速教程基础篇之 字典
4 ]2 _# O: z1 Z
字典
$ \: T7 L* l" r$ y- k% d  s
+ \" k. L! Y  n3 E6 Z- i2 m字典是一种非常常见的“键-值”(key-value)映射结构,键无重复,一个键不能对应多个值,不过多个键可以指向一个值。还是通过例子来了解,构建一个名字->年龄的字典,并执行一些常见操作:
$ q" J9 L3 l) P6 }a = {'Tom': 8, 'Jerry': 7}
3 l. e$ B9 _  R  V, Yprint(a['Tom']) # 8& W$ e! K1 `& n3 ?
b = dict(Tom=8, Jerry=7) # 一种字符串作为键更方便的初始化方式0 W. j( u& h" z  `- G' o  T
print(b['Tom']) # 89 V3 F/ G% v# C0 R
if 'Jerry' in a: # 判断'Jerry'是否在keys里面
, u; l' J7 K& I8 Fprint(a['Jerry']) # 7
1 U3 H9 w2 A; ^& s* Dprint(a.get('Spike')) # None,通过get获得值,即使键不存在也不会报异常7 E" o& G% a$ F+ Q- k' z* M  w. D" U
a['Spike'] = 103 }1 @: V) W4 E6 {0 |+ n: h1 C' T
a['Tyke'] = 36 w9 k1 n  Y7 l5 s
a.update({'Tuffy': 2, 'Mammy Two Shoes': 42})% n( W( ]: s4 t/ H: g3 x# A
print(a.values()) # dict_values([8, 2, 3, 7, 10, 42])
* T4 E# X4 a+ t9 m) e/ e! rprint(a.pop('Mammy Two Shoes')) # 移除'Mammy Two Shoes'的键值对,并返回42
7 C) @- v0 q3 k- r! N" aprint(a.keys()) # dict_keys(['Tom', 'Tuffy', 'Tyke', 'Jerry', 'Spike'])+ T  i) q: m7 |" u6 {" y- D( |

8 Z. E- H8 [( n( J5 o8 R) R注意到初始化字典和集合很像,的确如此,集合就像是没有值只有键的字典。既然有了人名到年龄的映射,也许你立马想到是否可以给字典排序?在Python3.6之前,这个问题是错误的,字典是一种映射关系,没有顺序。当然了,如果要把(键, 值)的这种对进行排序,是没有问题的,前提是先把字典转化成可排序的结构,items()或者iteritems()可以做到这件事,接上段代码继续:0 M) [' G: L, b* s
b = a.items()
6 }& B, e3 z2 d& `% q/ I6 Fprint(b) # [('Tuffy', 2), ('Spike', 10), ('Tom', 8), ('Tyke', 3), ('Jerry', 7)]
6 r1 Y7 {. l- |0 n! Tfrom operator import itemgetter8 r, w  U5 o) r
c = sorted(a.items(), key=itemgetter(1))( q2 a$ e& V- Y/ V& h; l; \
print(c) # [('Tuffy', 2), ('Tyke', 3), ('Jerry', 7), ('Tom', 8), ('Spike', 10)]& _! C. \" F1 y: [
d = sorted(a.iteritems(), key=itemgetter(1))
# L0 W" k, N, U7 hprint(d) # [('Tuffy', 2), ('Tyke', 3), ('Jerry', 7), ('Tom', 8), ('Spike', 10)]/ f+ Z  g- d- O
e = sorted(a)' Q* w3 Z- K$ a) }$ W- y3 M
print(e) # 只对键排序,['Jerry', 'Spike', 'Tom', 'Tuffy', 'Tyke']
% o) ?9 Z6 c3 g1 q* @
6 M8 J' R8 l$ P0 S6 Titems()可以把字典中的键值对转化成一个列表,其中每个元素是一个tuple,tuple的第一个元素是键,第二个元素是值。变量c是按照值排序,所以需要一个操作符itemgetter,去位置为1的元素作为排序参考,如果直接对字典排序,则其实相当于只是对键排序。字典被当作一个普通的可遍历结构使用时,都相当于遍历字典的键。如果觉得字典没有顺序不方便,可以考虑使用OrderedDict,使用方式如下:
) _: r$ l6 [8 H: f# ~$ g6 vfrom collections import OrderedDict
+ o3 z- }; r+ xa = {1: 2, 3: 4, 5: 6, 7: 8, 9: 10}
# }; w5 x4 h. t+ t2 ]4 H0 Hb = OrderedDict({1: 2, 3: 4, 5: 6, 7: 8, 9: 10})
' K) ~$ f4 m5 b5 h9 \6 ?0 p$ nprint(a) # {1: 2, 3: 4, 9: 10, 5: 6, 7: 8}
/ o1 ^) q; W8 l5 Z7 B1 D; y+ jprint(b) # OrderedDict([(1, 2), (3, 4), (9, 10), (5, 6), (7, 8)])+ H. H7 U9 X; V
8 z# T, \; j. q0 S4 a
这样初始化时的顺序就保留了,除了有序的特性以外,用法上和字典没有区别。2016年9月,Guido宣布在Python3.6中,字典将默认有序,这样就不用纠结了。另外需要注意的一点是字典是通过哈希表实现的,所以键必须是可哈希的, list不能被哈希,所以也不能作为字典的键,而tuple就可以。
% w0 [- u7 C: e* K* I2 w  [. ?% W. G9 v, K; ~. c( \$ H
因为上上段代码中用到了iteritems(),所以这里顺带提一下迭代器(iterator),迭代器相当于一个函数,每次调用都返回下一个元素,从遍历的角度来看就和列表没有区别了。iteritems()就是一个迭代器,所以效果一样,区别是迭代器占用更少内存,因为不需要一上来就生成整个列表。一般来说,如果只需要遍历一次,用迭代器是更好的选择,若是要多次频繁从一个可遍历结构中取值,且内存够,则直接生成整个列表会更好。当然,用迭代器生成一个完整列表并不麻烦,所以有个趋势是把迭代器作为默认的可遍历方式,比如前面我们使用过用来生成等差数列列表的range(),在Python2中对应的迭代器形式是xrange()。在Python3中,range()就不再产生一个列表了,而是作为迭代器,xrange()直接没了。

+ }$ f* Q+ y5 Q- U4 C
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

EDA365公众号

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

GMT+8, 2025-7-23 14:01 , Processed in 0.109375 second(s), 23 queries , Gzip On.

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

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

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