Day2 - Python基础2 列表、字典、集合、编码
Day2 - Python基础2 列表、字典、集合
1.列表、元组操作
1.1.列表
切片
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
切片是基于索引操作 >>> numbers = [1,2,3,4,5,6,7,8,9,10] >>> numbers[1:4] #包含1不包含4 [2, 3, 4] >>> numbers[:4] #4之前全取 [1, 2, 3, 4] >>> numbers[4:] #包含4之后全取 [5, 6, 7, 8, 9, 10] >>> numbers[::2] #间隔2个取 [1, 3, 5, 7, 9] >>> numbers[-1] #从右往左取 10
追加
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> numbers.append('追加的') >>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, '追加的']
插入
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, '追加的'] >>> numbers.insert(4,'4.5插入的') >>> numbers [1, 2, 3, 4, '4.5插入的', 5, 6, 7, 8, 9, 10, '追加的']
修改
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> numbers [1, 2, 3, 4, '4.5插入的', 5, 6, 7, 8, 9, 10, '追加的'] >>> numbers[4] = '4.5' >>> numbers [1, 2, 3, 4, '4.5', 5, 6, 7, 8, 9, 10, '追加的']
删除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> numbers [1, 2, 3, 4, '4.5', 5, 6, 7, 8, 9, 10, '追加的'] >>> del numbers[4] #删除下标4的元素 >>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, '追加的'] >>> numbers.remove('追加的') #删除指定元素 >>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> numbers.pop() #默认删除最后一个元素 10 >>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9] >>>
扩展
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9] >>> nums = [10,20,30] >>> numbers.extend(nums) >>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 20, 30]
拷贝
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> nums [10, 20, 30] >>> nums_copy = nums.copy() >>> nums_copy [10, 20, 30] >>> del nums_copy[0] #拷贝修改不会影响原列表 >>> nums_copy [20, 30] >>> nums [10, 20, 30] >>> del nums[2] #原列表修改不会影响拷贝 >>> nums [10, 20] >>> nums_copy [20, 30] >>>
统计
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> numbers = [1,2,3,1,5,6,3,8] >>> numbers.count(1) 2
排序&反转
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> numbers [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] >>> numbers.sort() #排序 >>> numbers [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] >>> numbers.reverse() #反转 >>> numbers [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] >>>
获取下标
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> numbers [10, 9, 8, 7, 6, 5, 4, 3, 2, 1] >>> numbers.index(10) 0
1.2.元组
又叫只读列表,一旦创建不能修改,只有2个方法,count 和index
# 方法: a = (1,2,3) #创建 print(a[0]) #查找(可以使用索引取元素) for i in a: print(i) #遍历列表元素 # 应用场景: #选择菜单等不能让用户随便修改的地方 while True: option = ('1.北京','2.深圳','3.上海') print(option) choice = input("你喜欢的城市是(1/2/3):") if choice == '1': print(option[0]) elif choice == '2': print(option[1]) else: print(option[2])
2.字符串操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#特性:不能修改 #首字母变大写 >>> name = 'my name is Sam' >>> name.capitalize() 'My name is sam' #大写变成小写 >>> name = 'my name is SAM' >>> name.casefold() 'my name is sam' #变量放中间,加起来10个字符长度 >>> name = 'sam' >>> name.center(10,"*") '***sam****' #将字符串编码成bytes格式 >>> name = '成龙' >>> name.encode() b'\xe6\x88\x90\xe9\xbe\x99' #判断是否以“end”结束 >>> name = 'This is end' >>> name.endswith('end') True #查找字符,有则返回第1个索引,无则返回-1 >>> name = '这是一个AAAAA景区' >>> name.find('A') 4 >>> name.find('B') -1 #format >>> student = "my name is {},age is {}" >>> student.format("sam",18) 'my name is sam,age is 18' >>> student = "my name is {name},age is {age}" >>> student.format(age=18,name='sam') 'my name is sam,age is 18' #format_map >>> student 'my name is {name},age is {age}' >>> student.format_map({'name':'sam','age':18}) 'my name is sam,age is 18' #返回字符所在的索引 >>> student 'my name is {name},age is {age}' >>> student.index('name') 3 #判断是否是整数 >>> '1'.isdigit() True #替换字符串 >>> student = "my name is sam" >>> student.replace("sam","jack",1) 'my name is jack' #不足长度用0填充 >>> student = "my name is sam" >>> student.zfill(50) '000000000000000000000000000000000000my name is sam'
3.字典操作
特性:
1.一种key-value的数据类型
2.dict是无序的
3.key必须是唯一的,天生去重
增加
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> stars = {'star1':'Jackie Chan','star2':'Jet Li','star3':'Donnie Yen','star4':'Wu Jing'} >>> stars['star5']='Tony Jia' >>> stars {'star4': 'Wu Jing', 'star2': 'Jet Li', 'star5': 'Tony Jia', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}
修改
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
>>> stars {'star4': 'Wu Jing', 'star2': 'Jet Li', 'star5': 'Tony Jia', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'} >>> stars['star5'] = 'ChiuMan-Cheuk' >>> stars {'star4': 'Wu Jing', 'star2': 'Jet Li', 'star5': 'ChiuMan-Cheuk', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'}
删除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#标准方法删除 >>> stars {'star4': 'Wu Jing', 'star2': 'Jet Li', 'star5': 'ChiuMan-Cheuk', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'} >>> stars.pop('star5') 'ChiuMan-Cheuk' >>> stars {'star4': 'Wu Jing', 'star2': 'Jet Li', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'} #del删除 >>> stars {'star4': 'Wu Jing', 'star2': 'Jet Li', 'star3': 'Donnie Yen', 'star1': 'JackieChan'} >>> del stars['star4'] >>> stars {'star2': 'Jet Li', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'} #随机删除 >>> stars {'star2': 'Jet Li', 'star3': 'Donnie Yen', 'star1': 'Jackie Chan'} >>> stars.popitem() ('star2', 'Jet Li')
查找
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#标准获取 >>> stars {'star3': 'Donnie Yen', 'star1': 'Jackie Chan'} >>> stars.get('star1') 'Jackie Chan' >>> stars['star1'] 'Jackie Chan' []没有对应的key时会报错,get方法不会,只返回None
多级字典嵌套及操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
av_catalog = { "欧美":{ "www.youporn.com": ["很多免费的,世界最大的","质量一般"], "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"] }, "日韩":{ "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"] }, "大陆":{ "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] } } av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来" print(av_catalog["大陆"]["1024"]) #ouput ['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']
其它方法
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#values >>> stars {'star3': 'Donnie Yen', 'star1': 'Jackie Chan'} >>> stars.values() dict_values(['Donnie Yen', 'Jackie Chan']) #keys >>> stars.keys() dict_keys(['star3', 'star1']) #items >>> stars.items() dict_items([('star3', 'Donnie Yen'), ('star1', 'Jackie Chan')])
循环dict
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#方法1 >>> stars {'star3': 'Donnie Yen', 'star1': 'Jackie Chan'} >>> for key in stars: ... print(key,stars[key]) ... star3 Donnie Yen star1 Jackie Chan #方法2 #会先把dict 转成list,数据大时勿用 >>> for k,v in stars.items(): ... print(k,v) ... star3 Donnie Yen star1 Jackie Chan
4.集合操作
集合是一个无序,不重复的数据组合,作用如下:
1.去重,把一个列表变成集合,就自动去重
2.关系测试,测试两组数据之前的交、差、并集等
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
s = set([3,5,9,10]) #创建一个数值集合 t = set("Hello") #创建一个唯一字符的集合 a = t | s # t 和 s的并集 b = t & s # t 和 s的交集 c = t – s # 求差集(项在t中,但不在s中) d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中) 基本操作: t.add('x') # 添加一项 s.update([10,37,42]) # 在s中添加多项 使用remove()可以删除一项: t.remove('H') len(s) set 的长度 x in s 测试 x 是否是 s 的成员 x not in s 测试 x 是否不是 s 的成员 s.issubset(t) s <= t 测试是否 s 中的每一个元素都在 t 中 s.issuperset(t) s >= t 测试是否 t 中的每一个元素都在 s 中 s.union(t) s | t 返回一个新的 set 包含 s 和 t 中的每一个元素 s.intersection(t) s & t 返回一个新的 set 包含 s 和 t 中的公共元素 s.difference(t) s - t 返回一个新的 set 包含 s 中有但是 t 中没有的元素 s.symmetric_difference(t) s ^ t 返回一个新的 set 包含 s 和 t 中不重复的元素 s.copy() 返回 set “s”的一个浅复制
5.文件操作
5.1.文件打开方式
f = open("文件路径",“打开方式”,encoding=“编码方式”)
f.close() #记得要关闭
with open("文件路径",“打开方式”,encoding=“编码方式”) as f: #此方式不需考虑文件关闭问题,当with代码块执行完毕时,内部会自动关闭并释放文件资源。
5.2.打开文件的模式有:
r,只读模式(默认)
w,只写模式。【不可读;不存在则创建;存在则删除内容】
a,追回模式。【可读;不存在则创建;存在则只追加内容】
"+"表示可以同时读写某个文件
r+,可读写文件。【可读;可写;可追加】
w+,写读(不常用)
a+,同a
"U"表示在读取时,可以将\r \n \r\n自动换成\n(与r或r+模式同时使用)
rU
r+U
"b"表示处理二进制文件(如FTP发送上传ISO文件,linux可忽略,windows处理二进制时需标注)
rb
wb
ab
5.3.修改文件内容
追加方式容易处理
修改部分内容较难处理,一般会新建一个文件,把原文件内容写入新文件再删除,然后把新文件名改成原文件名
6.字符编码与转码
unicode万国码支持所有国家编码,因此不同编码方式转换时,需先编码decode成unicode
详细文章:
http://www.cnblogs.com/yuanchenqi/articles/5956943.html
http://www.diveintopython3.net/strings.html
需知:
1.在python2默认编码是ASCII, python3里默认是unicode
2.unicode 分为 utf-32(占4个字节),utf-16(占两个字节),utf-8(占1-4个字节), so utf-16就是现在最常用的unicode版本, 不过在文件里存的还是utf-8,因为utf8省空间
3.在py3中encode,在转码的同时还会把string 变成bytes类型,decode在解码的同时还会把bytes变回string
上图仅适用于py2
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#-*- coding:utf-8 -*- import sys print sys.getdefaultencoding() #默认编码是ascii方式 msg = '我爱编程' #因默认是ascii,所以会乱码 msg_gb2312 = msg.decode('utf-8').encode('gb2312') #转换成gb2312 gb2312_to_gbk = msg_gb2312.decode('gb2312').encode('gbk') #gb2312转换成GBK print msg print msg_gb2312 print gb2312_to_gbk #执行结果 ascii 鎴戠埍缂栫▼ 我爱编程 我爱编程
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
import sys print (sys.getdefaultencoding()) #默认是UTF-8 msg = '我爱北京天安门' #不会乱码 #msg_gb2312 = msg.decode('utf-8').encode('gb2312') #python2转换成gb2312 msg_gb2312 = msg.encode('gb2312') #默认就是unicode,不用再decode gb2312_to_utf8 = msg_gb2312.decode('gb2312').encode('utf-8') bytes_to_str = gb2312_to_utf8.decode(encoding="utf-8") print (msg) print (msg_gb2312) print (gb2312_to_utf8) print (bytes_to_str) #执行结果 utf-8 我爱北京天安门 b'\xce\xd2\xb0\xae\xb1\xb1\xbe\xa9\xcc\xec\xb0\xb2\xc3\xc5' b'\xe6\x88\x91\xe7\x88\xb1\xe5\x8c\x97\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x89\xe9\x 97\xa8' 我爱北京天安门