![dd38d1c0923f1a7055a26c4c871d6453.png](https://i-blog.csdnimg.cn/blog_migrate/bee8cef1d329bb13b4fba945e36f6021.jpeg)
- 这是密歇根大学课程Python For Everybody总结的P2部分。课程总结P1部分的地址如下:
P1: 零基础程序设计(Python 入门)
carolinezhq:【Python】数据分析前的入门教程 Python For Everybody P1:零基础程序设计zhuanlan.zhihu.com![567304ad318ea47b8ecb5cd7561c45c0.png](https://i-blog.csdnimg.cn/blog_migrate/1943ca344e21cae6473b2284d994098a.jpeg)
P2: Python 数据结构
P3: 使用 Python 访问网络数据
P4: Python 数据库开发
P5: 毕业项目:使用Python获取并处理数据,并用可视化方式展现数据
2. 编程包含两方面,一是Algorithms算法:解决问题的一系列规则/步骤;二是Data Structures数据结构:在电脑上组织数据的方式。
P2部分的主要内容就是Python的数据结构:列表、字典与元组,以及怎么用它们来进行文件处理。P2总体逻辑结构上我动得还挺多的,欢迎小伙伴交流,点赞和收藏呀,我还会持续更新的~
![d540e869877a2338c08b564c434695c0.png](https://i-blog.csdnimg.cn/blog_migrate/f1a5cf7f9c831a6d57db0ed5f9fdab8d.jpeg)
C6 String字符串
1. str.method()字符串方法
![06171d503956cdc4ab10c688f5fde512.png](https://i-blog.csdnimg.cn/blog_migrate/029c31b2e3324db52d1b629c4502956e.jpeg)
- 字符串方法: string library里处理字符串的一系列内置函数。
- str.method()返回修改后的新字符串,但是并不改变原字符串
- 查看字符串可用方法:dir(str)
![6010f607e66104c3d1e75c5e917b4152.png](https://i-blog.csdnimg.cn/blog_migrate/afce490e34d59e6fd0401ba268ba8f07.jpeg)
常用字符串方法
![e3a99b9af195bcaa89dbf92e9c804560.png](https://i-blog.csdnimg.cn/blog_migrate/f9425533db552083909a9f9f07e1d862.jpeg)
*whitespace空白:所有不显示的space/tab/newline
2. 操作字符串:长找分合换
![599adfec09a6bc24bbf5444cb805088a.png](https://i-blog.csdnimg.cn/blog_migrate/adc6b105260a8f2db73725869f71457a.jpeg)
C7 Files 文件
1. File handle文件句柄
- 文本文件是由行组成的,每一行结尾都有一个newline character换行符 n,n是看不见的字符,其类型为str,是一个字符而不是两个,len("n")结果为1
- filehandle是open()函数返回的变量,用于按行操作文件,需为filehandle命名,print(filehandle)不显示文章实际内容
- 可以将文件句柄视为一个字符串序列a sequence of strings,文件中每一个以“n”结尾的行都是这个序列中单独的字符串。
![dcc406d61770eaad6137380503b6e7cb.png](https://i-blog.csdnimg.cn/blog_migrate/7024f60a1f386d68783229b3e714de62.jpeg)
2. 按行处理文件
- 这种处理方法将每一行当做一个str
1) 打开文件open() 函数
fhandle=open(filename)
#或者
fhandle=open(filename,mode)
# mode可省。'r'表示只读;'w'表示编辑。不要忘记引号!
2) 对文件进行按行打印/对行计数/查找行
fhandle=open(filename)
for line in fhandle:
line=line.rstrip()
statement
- 用str.rstrip()处理多余的n:文本每一行本身后面就有一个n结尾,在打印的时候由于for循环,会在后面自动再加一个n,所以打印出的结果行中间穿插有空行。用line=line.rstrip()删去n。这是一个非常常用的代码
![d40d5235c5fd6f0b298bd93658c9395b.png](https://i-blog.csdnimg.cn/blog_migrate/61d8d4960a7235dfc0c6f287719cddc9.jpeg)
- 在statement做文章,可以完成对问文档按行打印/对行计数/查找行(可能会用到count=count+1计数;str.startswith()筛选行、continue跳过不需要的行、用in查找包含某字符串的行等)
3. 把文件视为一整个字符串进行处理
- 这种方法将整个file当做一个str(newline和其他符号也包括在内),因此不适用于过大的文件;如果文件过大,如几百万行,还是按行读比较好
1)读取文件filehandle.read()方法
fhandle=open(filename)
strname =fhandle.read()
statement
2) 利用statement完成按字符打印/文本字符计数/查找字符(和C6对str的操作一致)
- 按字符打印:print(strname)
- 文本字符计数:直接用len(strname)计数文件有多少字符(这样会计入所有的字符,比如n)。
- 查找字符:切片。print(strname[位置1:位置2])打印切片(实际上位置1、2并不好找)
![37bd0277d064b6e49c98399ebc6881b0.png](https://i-blog.csdnimg.cn/blog_migrate/dc9b9a3e0ea28f73b6402f5303a4fad8.png)
C8 List列表
1. 列表
1) list有序、可变mutable
- 形式: 中括号+逗号 listname=[a,b,c]
- 列表里的元素可以是Python里的任何object对象,甚至是其他列表;列表可以为空[]
- 字符串immutable不可变,不能改变字符串的内容,若需改动,需重新赋值;列表mutable可变,用索引操作符可以改变列表里的元素。
#创建list
listname=list()
#或
listname=[]
#修改列表元素
list[位置]=newobj
2)range(n) 返回由0到n-1的整数数字构成的迭代对象
- Python 3中range(n)函数返回迭代对象range(0,n)而不是列表;把迭代对象放在像list这样的迭代器里面,才能成为列表
print(range(5)) #range(0,5)
print(list(range(5))) #[0,1,2,3,4]
3) list与for循环
for obj in list:
statement
#或者
for i in range(len(list)):
statement
![65af327dfc6d5266d8df0d65297fee9a.png](https://i-blog.csdnimg.cn/blog_migrate/31924053fb2ec9d40832b2711a2aeb95.jpeg)
2. 列表函数及list.method()列表方法
1)针对list的内置函数:
- min(listname)/max(listname)/sum(listname)
求平均数时,循环的两种写法,右边在计算之前要把所有数据存起来,更占内存。
![a14fe67d06ee774954e5eb2e3d3b1ef9.png](https://i-blog.csdnimg.cn/blog_migrate/27069a5fb556853eccdc78a47838e571.jpeg)
2)list.method()列表方法
- 查看列表可用方法:dir(list)
![9e00c17fef5de665b473b97c6869d95c.png](https://i-blog.csdnimg.cn/blog_migrate/8613664af180f99af39bd0cc010454ca.jpeg)
常用列表方法
![fe6be47d8c87f0d02b7b7d5ee3fb410f.png](https://i-blog.csdnimg.cn/blog_migrate/301818f2848a548990251ca7745bf1f7.jpeg)
list.append(obj) 在列表末尾添加元素
- 可添加各种数据类型/数据结构,但是一次只能添加一个元素(列表实参)
- 字符串记得加引号
- 注意:给列表添加元素时,list=list.append(obj)是错误的,会返回None;list.append(obj)就可以直接改动列表本身,print(list)直接就是新列表。相比之下,由于str不可变,str.method()不改变原有字符串,需要用赋值的方式str=str.method()替换旧变量才能起到改变的效果。
3.操作列表:长找分合换
![4363cd7c67aaf74a5a30ed5a5036143a.png](https://i-blog.csdnimg.cn/blog_migrate/ea6e1eeaef3f519ada94215ac01e3e5f.jpeg)
4.str转list:str.split()方法
listname=list()
listname=str.split()
#默认分隔符为whitespace(space/tab/newline)
#或者自己定义分隔符delimiter是什么
listname=list()
listname=str.split(delimiter)
实例:对于一个长字符,想取出其中的一段字符串
- 法1:find找出首尾位置1、2;str[位置1,位置2]切片
- 法2:str.split()利用特殊分隔符str转list;list[位置]索引
C9 Dictionary字典
1.字典dictionary:python最强大collection
- 存在于很多语言中,只是名字不一样。如perl/php: associative arrays关联数组。字典可改,无序,靠key进行索引。
- 字典的组成Dictionary Literals(Constants):curly braces花括号+a list of keys: values pairs。基本形式dictname={key1: value1,key2: value2}。
创建空字典
dictname=dict()
#或者
dictname={}
创建字典
dictname={key1: value1,key2: value2,…}
#或者
dictname[key1]=value1
dictname[key2]=value2
…
向字典里添加元素
dictname[newkey]=newvalue
#如果是写了已经有的key,就变成修改该key的键值了
- 字典里的1)value键值不需要唯一;而键必须保持唯一,如果同一字典内添加的键出现了重复,后面的键值会替换前面的键值,最终只保留最后一个键值;2)值可以取任何数据类型;但键必须是不可变的,如字符串,数字或元组,键不能取列表。
2. 常用dict.method()字典方法
![0dceb6679c8f2af51b6ee0cb9af689b0.png](https://i-blog.csdnimg.cn/blog_migrate/0b1fe2fbc218a6d8efb822431bcfbb44.png)
![4f8fa5d80b6bada17498b83e66bf7fa7.png](https://i-blog.csdnimg.cn/blog_migrate/6c56d253ce83a6259b582531ef6e3377.jpeg)
3.操作字典:长找换
![2cf0d8396105fc1ed30568fa654fd751.png](https://i-blog.csdnimg.cn/blog_migrate/b00a35d1eb9c4a0a2ff8d76c51d04a80.jpeg)
4. 实例:统计文件中每个词出现的频数
1)用dic[obj]=dic.get(obj,0)+1一次性完成计数和赋值(常用idiom)
dic=dict()
for obj in list:
dic[obj]=dic.get(obj,0)+1
print(dic)
#注意:由于字典是无序的,所以最终统计出来的词频也是无序的。
![b8219b81397327f7295b4b28b35c30b2.png](https://i-blog.csdnimg.cn/blog_migrate/6829953be1d533077497c36fa37a1bb9.jpeg)
![9feb4c6f7c0ed4922ad22e6ea501f1cb.png](https://i-blog.csdnimg.cn/blog_migrate/f073c5e6c91490d730c697705dff5bf0.jpeg)
2)实例:统计文件中出现次数最多的词及其频数(C10利用元组的比较来为无序的字典排序,蓝色部分会更加精简)
![feb69e9b3effe0fe3a021976e5e114e5.png](https://i-blog.csdnimg.cn/blog_migrate/f962b10c41500da8c47536cbd871f241.jpeg)
C10 Tuples元组
1. 定义
- Tuples元组有序不可更改。基本形式是圆括号+逗号隔开,
tuplename=(obj1, obj2, obj3…)
- tuples and assignment元组可以同时给多个对象赋值(注意赋值之后元组不能改!)。可以把元组放在赋值符号的左边(python 特别好的功能),甚至可以省略括号。下面例子要保证赋值左右元素数量相等
# 元组可以同时给多个对象赋值
a,b,c,d=(2,3,4,5)
print(c) #4
#2,3,4,5直接就一对一赋值给了a,b,c,d
- tuples的出现是为了提升效率,它们储存空间小,访问速度快。如果只是想储存一个list,看一下丢掉,用tuple更好。
2. 操作元组
![5ac43f9f584202cd63c450b9c4210c34.png](https://i-blog.csdnimg.cn/blog_migrate/09176f025df52199c0673d722ce0b482.jpeg)
3. 利用元组的可比性给字典里的元素排序
1)元组有可比性
![ab95abdd6d3dd9a1821a1aacae2cca3b.png](https://i-blog.csdnimg.cn/blog_migrate/06608d7f6cf8c30905954145ec82d28d.jpeg)
- 从左边开始,只要有一对对应位置的元素满足条件,就返回True,后面的元素根本不比较。如果第一对元素结果为False,就继续比较下一对元素,以此类推,直到返回True就立刻停止比较。
- 字符串的比较:如Sally和Sam开始Sa一样,但是l在m前面,所以'Sally'<'Sam'。只对比到有第一个明确的答案出现就停止
2)sorted(iretable)函数 vs. list.sort()方法
sorted(iretable) #默认False升序
#或者
sorted(iretable,reverse=False升序/True降序)
- sorted(iretable)函数适用于所有可迭代变量;而list.sort()方法仅使用于列表
3) 利用tuples的可比性和sroted()函数给字典里无序的元素排序
实例:求出文件里出现频数前10的词及其频数(P2所有章节代码综合应用)
- 注意top10比的是元组(value,key),和dict里面的元组中的元素顺序相反
![151884268d02a6033a3e679c97dae5e1.png](https://i-blog.csdnimg.cn/blog_migrate/cb935266e665731aae92b8a177ca52a0.jpeg)
- list comprehension列表推导式
上面C10部分对应的代码还有列表推导式的写法:更短,执行起来更高效
![c4a1299131d03d788e9fc781c63a2a99.png](https://i-blog.csdnimg.cn/blog_migrate/428a1f1feaa834344ad4b1243b00d22e.jpeg)