写在前面:其实能发现这本书的章节安排并没有很系统,有些地方我觉得再多写一些东西进去就更好了。。。恩,老老实实顺着书的目录往下去吧,得相信作者这样安排是有用意的。。
第三章
3.1.3 内建序列函数
a) enumrate 我们通常需要在遍历一个序列的同时追踪当前元素的索引,如打印成绩排名,常用使用添加一个flag的for循环的方式:
>>>name_list = ['aa', 'bb', 'cc', 'dd'] >>>dict_list={} >>>i = 1 >>>for name in name_list: dict_list[i] = name print(i, name) i += 1 1 aa 2 bb 3 cc 4 dd >>>dict_list[3] cc当名单很长,我们仅仅想直接知道第多少名是谁时,可以通过将排名和名字存入字典,访问相应的键变得到了相应位次的同学。但这样代码显得不够简洁,因此python引入了enumerate函数,它返回了(i, value)的元组序列,其中i是元素的索引,value是元素的值。通过向其传入start参数,指定当前索引的初始值,默认为0。事实上,enumerate函数的使用对象为所有可遍历的数据对象(如列表、元组或字符串)。
>>>name_list = ['aa', 'bb', 'cc', 'dd'] >>>list(enumerate(name_list, start=1)) [(1, 'aa'), (2, 'bb'), (3, 'cc'), (4, 'dd')] >>>dict1 = {} >>>for i, value in enumerate(name_list, start=1): ... dict1[i] = value >>>dict1 {1: 'aa', 2: 'bb', 3: 'cc', 4: 'dd'} >>>dict1[3] 'cc'b) sorted函数,返回一个根据任意序列中的元素新建的已排序列表,它与list.sort()的区别在于它是新会返回一个新的列表而不改变原有的列表,而且它可以对所有可迭代的对象进行排序操作。其他用法与sort相似。
>>>list1 = [2, 3, 5, 4, 1, 5, 8, 9, 43, 35] >>>sorted(list1) [1, 2, 3, 4, 5, 5, 8, 9, 35, 43] >>>list1 [2, 3, 5, 4, 1, 5, 8, 9, 43, 35]c) zip函数会将列表、元组或者其序列的元素配对,新建一个元组构成的新对象。zip类型的对象需要转为为列表方便进行其他操作(实例化)。
>>>list1 = [1, 2, 3, 4, 5] >>>list2 = ['a', 'b', 'c', 'd', 'e'] >>>list3 = ['A', 'B', 'C', 'D'] >>>zipped1 = zip(list1, list2) #zipped1类型为zip,转换为列表方便进行其他操作 >>>zipped1 <zip object at 0x00000201990FCF08> >>>list(zipped1) [(1, 'a'), (2, 'b'), (3, 'c'), (4, 'd'), (5, 'e')] >>>zipped2 = zip(list1, list2, list3) #zip可以处理任意长度的序列,生成新对象长度由最短序列决定 >>>list(zipped2) [(1, 'a', 'A'), (2, 'b', 'B'), (3, 'c', 'C'), (4, 'd', 'D')]zip的常用场景为同时遍历多个序列,有时会和enumerate同时使用:
>>>list1 = [1, 2, 3, 4, 5] >>>list2 = ['a', 'b', 'c', 'd', 'e'] >>>for i, (a, b) in enumerate(zip(list1, list2)): ... print('{0}: {1}, {2}'.format(i, a, b)) 0: 1, a 1: 2, b 2: 3, c 3: 4, d 4: 5, e另一种常用的情况是用zip函数来管理表数据,进行行和列之间的变换,更方便的进行插入和删除列操作,如下图,zip做的其实就是将数据便转了90°,将以前的列变成了行,在python中,对行的处理比对列简易的多。使用方法为使用*拆分已‘配对’好的数据表。table1 = zip(*list(table2))
>>>list1 = [1, 2, 3, 4, 5] >>>list2 = ['a', 'b', 'c', 'd', 'e'] >>>list3 = ['A', 'B', 'C', 'D', 'E'] #转90°,行变列 >>>table1 = zip(list1, list2, list3) >>>list(table1) #zip [(1, 'a', 'A'), (2, 'b', 'B'), (3, 'c', 'C'), (4, 'd', 'D'), (5, 'e', 'E')] #添加新元素 >>>table2 = list(table1).append((6, 'f', 'F')) >>>list(table2) [(1, 'a', 'A'), (2, 'b', 'B'), (3, 'c', 'C'), (4, 'd', 'D'), (5, 'e', 'E'), (6, 'f', 'F')] #转90°,列变回行 >>>table3 = zip(*list(table2)) >>>list(table3) [(1, 2, 3, 4, 5, 6), ('a', 'b', 'c', 'd', 'e', 'f'), ('A', 'B', 'C', 'D', 'E', 'F')]d)reversed函数用来将序列的元素倒序排列,返回的对象同样需要实例化才能继续操作。
list(reversed(range(10))) [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]3.14 字典是python内建数据结构中最重要的,也称哈希表或者关联数组,是一种无序数据对象。字典是一种键值对的组合,键必须是唯一不可变对象,值可以是不唯一可变对象。使用del键或者pop键的方法删除值。keys和values方法会返回字典键、值的迭代器。使用update放法将两个字典合并,如果传入的字典含有与原字典相同的键,原来字典的值会被覆盖。
>>>dict1 = {1:'a', 'b':2, 'list1':[1, 2, 3], 'tup1':(4, 5, 6)} #访问 >>>dict1['list1'] [1, 2, 3] #增加 >>>dict1['h'] = 'happy' >>>dict1 {1: 'a', 'b': 2, 'list1': [1, 2, 3], 'tup1': (4, 5, 6), 'h': 'happy'} #删除 >>>dict1.pop('tup1') (4, 5, 6) >>>dict1 {1: 'a', 'b': 2, 'list1': [1, 2, 3], 'h': 'happy'} >>>del dict1[1] >>>dcit1 {'b': 2, 'list1': [1, 2, 3], 'h': 'happy'} #返回键、值 >>>list(dict1.keys()) ['b', 'list1', 'h'] >>>list(dict1.values()) [2, [1, 2, 3], 'happy'] #合并字典 >>>dict2 = {2:'b', 3:'c'} >>>dict1.update(dict2) >>>dict1 {'b': 2, 'list1': [1, 2, 3], 'h': 'happy', 2: 'b', 3: 'c'}从序列生成字典: 当有两个序列想要在字典中按元素配对时,第一种方法可以:
dict1 = {} for key, value in zip(key_list, value_list):#上面提到的zip同时遍历多个序列的方法 dict1[key] = value还有一种更简单的:
dict2 = dict(zip(key_list, value_list))