reading Foundations for Analysis with Python Day2
这篇笔记是阅读《Python数据分析基础》的第二篇,第一篇笔记讲了关于本书的简介、Python3运行环境与交互、四种数值类型、字符串以及日期类型。今天这篇主要讲Python中保存数据的容器以及简单文件读写。
目录
- 列表
- 元组
- 字典
- 文件读写入门
列表
第一篇文章里我们构建的都是单个的变量,如语句 a=3 ,得到的变量a只是一个数值,如果我们有一组数字要处理呢?逐条声明a=1,b=2,c=3……?要表示一组数,在编程语言中可以用数组来作为容器装载,Python里面
a=[10,20,30,40,50]
用中括号将一组数归在一起,得到的就是一个列表,Python的列表(list)与其他编程语言的数组最大到不同就是列表里面的元素类型可以是任意的,不需要是同一种类型,列表里可以装整数、复数、字符串、甚至下面讲到的元组、字典,例如下面语句都是合法的:
list0=list([1,2,3,4,5]) #也可以用list()创建
list1=[3.14,2+5j,'lyndon','2018-3-14'] #有小数、复数、字符串类型
list2=[5,[1,2],(1,3),{'e':2.718,'pi':3.14159}]
list3=[[1,2,3],[4,5,6],[7,8,9]] #创建二维数组,数据分析中经常要处理的是多维数组
列表的创建就是将元素用方括号(英文的方括号[]不是中文的【】)括起来,元素之间用英文逗号隔开,例如 ['元素1','元素2','元素3']。
现在我们学会了创建一个列表,之后自然是怎么获取某个位置的值,总不能我把一些元素放到列表里,现在想拿出来却不知道怎么拿吧?这就涉及到列表的索引了。和其他语言一样,通过下标索引某个位置的值(所以如果你有其他语言基础这里就可以跳过了,如果没有学过其他语言,知道了Python列表的索引方式,之后学其他语言数组的索引页不在话下)。
print('a[0]=',a[0]) #下标从0开始而不是1,第一个元素是a[0]
print('a的最后一位:',a[-1]) #Python可以用-1索引到最后一位,这个在其他语言不适用
#其他语言想要索引最后一位怎么办?一般是通过获取数组长度len_a,然后a[len_a-1]
a[0]= 10
a的最后一位: 50
当索引超出范围时,会报错:
print(a[9]) #报错信息如下:
IndexError Traceback (most recent call last)
in ()
----> 1 print(a[9])
IndexError: list index out of range
错误提示中的 IndexError: list index out of range 意思还是很明显的,索引超出范围了。
不像其他语言的数组创建后是定长的(当然C语言后动态链表,这个不在此处展开了),例如声明了一个长度为20的数组,超出20个数就不能加进来了,Python的列表支持用 append(x) 在尾部增加元素,x可以是任意的数据类型,extend(k) 可以将迭代器k中的元素追加到列表里,k一般为列表、元组,当k是字典时,加入的是字典的键。上述两个函数都是加到末尾,那么能不能加到某个位置呢?可以用 insert(idx,val) 达到目的。idx是索引值,val是要插入的值。
- append() #末尾增加元素
- extend() #末尾增加多个元素
- insert(i,v) #插入i位置一个元素v
- remove() #删除指定元素
- pop() #弹出某个位置的元素
- index() #某个值第一次出现的位置
- sort() #在原处排序,与sorted()区分
- reverse() #反转列表
print('原来的a:',a)
a.append('append str')
a.extend(['6',70])
a.insert(1,100)
print('之后的a:',a)
a.reverse()
print('反转1:',a)
print(a[::-1]) #除了书中提到的用reverse之外,还可以用 [::-1]反转,称作切片
输出:
原来的a: [10, 20, 30, 40, 50]
之后的a: [10, 100, 20, 30, 40, 50, 'append str', '6', 70]
反转1: [70, '6', 'append str', 50, 40, 30, 20, 100, 10]
[10, 100, 20, 30, 40, 50, 'append str', '6', 70]
列表包含的处理方法有很多,要应用好请多练习。具体要实现某种需求又不知道有没有内置的方法去实现是,可以尝试搜索问题,关于列表的排序、深复制/浅复制本篇笔记不进行说明。
元组
元组和列表有很多相似之处,也可以装入多种类型的数据,可以通过下标索引,书中说两者最大的不同在于元组的值不能修改,例如下面的代码,企图修改一个元组会出错。
t1=(1,2,3,'k')
t1[2]=4
输出:
TypeError Traceback (most recent call last)
in ()
1 t1=(1,2,3,'k')
----> 2 t1[2]=4
TypeError: 'tuple' object does not support item assignment
这个特性一般是将它作为一个常量来使用,不能改元素值,会更安全。因为元组其他特性和列表相似或相同,就不进行仔细的说明了。
字典
字典也是Python里面非常重要的容器,它是通过键值对来联系两个元素的,类似于数学中函数的概念,一个x对应1个y,关于键-值存储、散列值等概念,建议翻看原书或查其他资料。创建字典(dict)的方法如下:
d1={'key1':1,'key2':2,'key3':[1,2]}
d2={'k1':'v1','name':{'fn':'tom','ln':'holland'},'y':[1,2]}
#多个镶套的字典可以构成前端很重要的数据格式json
in or not in
in是Python里较常用的关键字,用in可以判断元素是否在容器里,例如判断元素10是否在列表a里。get通常用来获取字典中的元素。
print('yes') if 10 in a else print('no')
print(d1.get('key3'))
print(d1.get('k3'))
输出:
yes
[1, 2]
None
文件读写入门
书中第一章讲的是比较基础的文件读写,在之后三章会详细讲解csv、Excel、MySQL文件数据的读写。 Python中简单读文件还是比较容易的,通过open()可以打开文件,因为第二章会具体讲解,这里主要实现两个简单的例子。一个是传统的读取方式,另一个是用with语句,从安全性来讲,with是更好的,一般推荐使用with进行文件的读写,可以不用写close(),但写其他语言的同学记得用其他语言的时候不要忘记写close()语句。
#假设 文件目录下有一个chpOneFile.txt 的文件
fileName='chpOneFile.txt'
#用绝对路径请写:
#fileName='D:/PythonBooks/chpOneFile.txt'
freader=open(fileName,'r') #r 代表读取
for line in freader:
print(line,end='') #按行输出
freader.close() #关闭文件
print('closed')
#用with的方式
with open(fileName,'r') as f:
for line in f:
print(line,end='') #按行输出
写文件
# 文本读取和写入有时候会涉及编码问题
#写文件
alst=['a','b','c']
with open('fileForWrite.txt','a+') as wf:
for i in alst:
wf.write(i) #逐行写入
这篇笔记主要讲了三种数据结构(列表、元组、字典)以及简单的文件读取和写入,下一篇会深入文本文件的读取和写入,csv就是数据科学中非常常用的一种数据表示方式。本篇笔记对三种数据结构并没有讲得很全面,因为要展开讲可以讲很多内容,列表的知识在一些Python教材里就是一个章节的内容了。书中还讲了一些拓展性的数据结构,如栈、队列、树和图,这部分知识在第9章。多练习是很有必要的,有任何建议欢迎提出。