利用python进行数据分析(三)

写在前面:其实能发现这本书的章节安排并没有很系统,有些地方我觉得再多写一些东西进去就更好了。。。恩,老老实实顺着书的目录往下去吧,得相信作者这样安排是有用意的。。

第三章

3.1.3 内建序列函数

a) enumrate
我们通常需要在遍历一个序列的同时追踪当前元素的索引,如打印成绩排名,常用使用添加一个flagfor循环的方式:

>>>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))
利用python进行数据分析(三)_第1张图片

>>>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))

你可能感兴趣的:(利用python进行数据分析,python)