Day2-列表、字典、集合 |
作者:矮哥 归档:学习笔记 2017/01/28 |
目 录
列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作
定义列表
1 >>> name = ["Aige","Jackson","Tom"] 2 3 >>> name 4 5 [‘Aige‘, ‘Jackson‘, ‘Tom‘] 6 7 >>> 8
通过下标访问列表中的元素,下标从0开始计数
1 >>> name[0] 2 3 ‘Aige‘ 4 5 >>> name[1] 6 7 ‘Jackson‘ 8 9 >>> name[2] 10 11 ‘Tom‘ 12 13 >>> name[3] #没值就会报错 14 15 Traceback (most recent call last): 16 17 File "<stdin>", line 1, in <module> 18 19 IndexError: list index out of range 20 21 >>> 22
切片:取多个元素
1 >>> name = ["Aige","Jackson","Tom","Can","David"] 2 3 >>> name[1:3] #取下标1至下标3之间的数字,包括1,不包括3 4 5 [‘Jackson‘, ‘Tom‘] 6 7 >>> name[1:-1] #取下标1至-1的值,不包括-1 8 9 [‘Jackson‘, ‘Tom‘, ‘Can‘] 10 11 >>> name[0:3] 12 13 [‘Aige‘, ‘Jackson‘, ‘Tom‘] 14 15 >>> name[:3] #如果是从头开始取,0可以忽略,跟上句效果一样 16 17 [‘Aige‘, ‘Jackson‘, ‘Tom‘] 18 19 >>> name[3:] #如果想取最后一个,必须不能写-1,只能这么写 20 21 [‘Can‘, ‘David‘] 22 23 >>> name[3:-1] #这样-1就不会被包含了 24 25 [‘Can‘] 26 27 >>> name[0::2] #后面的2是代表,每隔一个元素,就取一个 28 29 [‘Aige‘, ‘Tom‘, ‘David‘] 30 31 >>> name[::2] #和上句效果一样 32 33 [‘Aige‘, ‘Tom‘, ‘David‘] 34
追加
1 >>> names = ["Aige","Jackson","Tom","Can","David"] 2 3 >>> names.append("I am new friend") 4 5 >>> names 6 7 [‘Aige‘, ‘Jackson‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘] 8 9 >>> 10
插入
1 >>> names 2 3 [‘Aige‘, ‘Jackson‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘] 4 5 >>> names.insert(2,"强行从Jackson后面插入") 6 7 >>> names 8 9 [‘Aige‘, ‘Jackson‘, ‘强行从Jackson后面插入‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘] 10 11 >>> 12
修改
1 >>> names 2 3 [‘Aige‘, ‘Jackson‘, ‘强行从Jackson后面插入‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘] 4 5 >>> names[2]="谁叫你插的,走开" 6 7 >>> names 8 9 [‘Aige‘, ‘Jackson‘, ‘谁叫你插的,走开‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘] 10 11 >>> 12
删除
1 >>> names 2 3 [‘Aige‘, ‘Jackson‘, ‘谁叫你插的,走开‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘] 4 5 >>> del names[2] #指定位置删除 6 7 >>> names 8 9 [‘Aige‘, ‘Jackson‘, ‘Tom‘, ‘Can‘, ‘David‘, ‘I am new friend‘] 10 11 >>> names.remove("Tom") #指定元素删除 12 13 >>> names 14 15 [‘Aige‘, ‘Jackson‘, ‘Can‘, ‘David‘, ‘I am new friend‘] 16 17 >>> names.pop() #删除最后一个 18 19 ‘I am new friend‘ 20 21 >>> names 22 23 [‘Aige‘, ‘Jackson‘, ‘Can‘, ‘David‘] 24 25 >>> 26
扩展
1 >>> names 2 3 [‘Aige‘, ‘Jackson‘, ‘Can‘, ‘David‘] 4 5 >>> b = ["扩展","I am",1,2,3] 6 7 >>> names.extend(b) 8 9 >>> names 10 11 [‘Aige‘, ‘Jackson‘, ‘Can‘, ‘David‘, ‘扩展‘, ‘I am‘, 1, 2, 3] 12 13 >>> 14
拷贝
1 >>> names = ["aige",["waihao","can"]] 2 3 >>> names 4 5 [‘aige‘, [‘waihao‘, ‘can‘]] 6 7 >>> names2 = names.copy() #浅COPY,只拷贝了一层 8 9 >>> names2 10 11 [‘aige‘, [‘waihao‘, ‘can‘]] 12 13 >>> names[0] = "AIGE" 14 15 >>> names 16 17 [‘AIGE‘, [‘waihao‘, ‘can‘]] 18 19 >>> names2 20 21 [‘aige‘, [‘waihao‘, ‘can‘]] 22 23 >>> names[1][0] = "外号" 24 25 >>> names 26 27 [‘AIGE‘, [‘外号‘, ‘can‘]] 28 29 >>> names2 30 31 [‘aige‘, [‘外号‘, ‘can‘]] 32 33 >>> 34 35 import copy 36 37 names4 = copy.copy(names) 38 39 names[1] = "CAN" 40 41 print(names,names4) #这个也是浅copy 42 43 names5 = copy.deepcopy(names) 44 45 names[0] = "哈哈" 46 47 names[2][0] = "阿雷克斯" 48 49 print(names,names5) #深copy 一般不用‘‘‘ 50
统计
1 >>> count_list = [1,2,1,2,3,4,5,7,1,1,0] 2 3 >>> count_list.count("1") 4 5 0 6 7 >>> count_list.count(1) 8 9 4 10 11 >>> 12
排序和翻转
1 >>> names = ["aige","Can","Jack","Tom"] 2 3 >>> names 4 5 [‘aige‘, ‘Can‘, ‘Jack‘, ‘Tom‘] 6 7 >>> names.sort() #特别提醒,不同类型数据,不能排序 8 9 >>> names 10 11 [‘Can‘, ‘Jack‘, ‘Tom‘, ‘aige‘] #按照ASCII排序 12 13 >>> names.reverse() 14 15 >>> names 16 17 [‘aige‘, ‘Tom‘, ‘Jack‘, ‘Can‘] 18 19 >>> 20
获取下标(索引)
1 >>> names 2 3 [‘aige‘, ‘Tom‘, ‘Jack‘, ‘Can‘] 4 5 >>> names.index("Jack") 6 7 2 8 9 >>> 10
元组
元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表
语法
1 names = ("Aige","jack","eric") #中括号换小括号,既是元组
特性:不可修改
1 name = "my name is aige {names}" 2 3 print(name.capitalize()) #首字母大写 4 5 print(name.count("a")) #统计字母个数 6 7 print(name.center(20,"-")) 8 9 print(name.endswith("e")) #以什么结尾 10 11 print(name.find("aige")) #字符的索引,字符串可以切片 12 13 print(name.format(names="AIGE")) 14 15 print(name.isalnum()) #包含英文字符和阿拉伯数字 16 17 print(name.isalpha()) #纯英文字符 18 19 print(name.isdigit()) #是不是整数 20 21 print(name.isidentifier()) #判断是不是合法的标识符 是不是合法变量名 22 23 print(name.islower()) 24 25 print(name.isnumeric()) #只有数字,不能有小数点 26 27 print(name.istitle()) #每个字母开头大写 28 29 print(name.isupper()) #大写 30 31 print(‘+‘.join([‘1‘,‘2‘,‘3‘])) 32 33 print( name.ljust(50,"*") ) #不够50字节用*号补上 34 35 print( name.rjust(50,"@")) 36 37 print( name.lower()) 38 39 print( name.upper()) 40 41 print( "\nalex\n".lstrip()) #去掉左边的空格和回车 42 43 print( "\nalex\n".rstrip()) #去右边 44 45 print("\n alex \n".strip()) #去两边 46 47 p = str.maketrans("abcdef","123456") 48 49 print("aige Zhang".translate(p)) #一一对应的换,有点类似shell:tr命令 50 51 print("aige aige".replace("a","A")) #替换 52 53 print("aige aige".replace("a","A",1)) #替换一个 54 55 print("aige aige".rfind(‘e‘)) #找到最后一个被找到的地方 56 57 print("bingo nice gogo".split()) #字符串转成列表 58 59 print("bingo \n hahaha".splitlines()) #换行符换成列表 60 61 print("aige".startswith("a")) 62 63 print("Aige zhang".swapcase()) #大小写转换 64 65 print("aige can".title()) 66 67 print("aige aige ".zfill(30)) 68
字典一种key - value 的数据类型,使用就像我们上学用的字典,通过笔划、字母来查对应页的详细内容。
语法:
view code1 info = { 2 3 ‘stu001‘:"aige", #键值和value对应关系 4 5 ‘stu002‘:"can", #通过key查找value 6 7 ‘stu003‘:"happy", #字典是无序 8 9 } 10
字典的特性:
l dict是无序的
l key必须是唯一的,so 天生去重
增加
1 >>> names = {"stu001":"Aige","stu002":"Jack","stu003":"Tom"} 2 3 >>> names 4 5 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Tom‘} 6
修改
1 >>> names["stu004"] = "新人" 2 3 >>> names 4 5 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Tom‘, ‘stu004‘: ‘新人‘} 6 7 >>> names["stu004"] = "已经认识了:张三" 8 9 >>> names 10 11 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Tom‘, ‘stu004‘: ‘已经认识了:张三‘} 12
删除
1 >>> names.pop("stu004") 2 3 ‘已经认识了:张三‘ 4 5 >>> names 6 7 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Tom‘} 8 9 >>> names 10 11 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Tom‘} 12 13 >>> del names["stu003"] 14 15 >>> names 16 17 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘} 18 19 >>> 20 21 >>> names 22 23 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Jack‘, ‘stu004‘: ‘Tom‘, ‘stu005‘: ‘Harry‘, ‘stu006‘: ‘HengYuansan‘} 24 25 >>> names 26 27 {‘stu001‘: ‘Aige‘, ‘stu002‘: ‘Jack‘, ‘stu003‘: ‘Jack‘, ‘stu004‘: ‘Tom‘, ‘stu005‘: ‘Harry‘, ‘stu006‘: ‘HengYuansan‘} 28 29 >>> names.popitem() ##随机删 30 31 (‘stu006‘, ‘HengYuansan‘) 32 33 >>> names.popitem() 34 35 (‘stu005‘, ‘Harry‘) 36 37 >>> names.popitem() 38 39 (‘stu004‘, ‘Tom‘) 40 41 >>> 42
查找
1 >>> info = {‘stu002‘: ‘LongZe Luola‘, ‘stu003‘: ‘XiaoZe Maliya‘} 2 3 >>> "stu002" in info 4 5 True 6 7 >>> info.get("stu002") #没有key值也不会报错 8 9 ‘LongZe Luola‘ 10 11 >>> info["stu002"] 12 13 ‘LongZe Luola‘ 14 15 >>> info["stu004"] #没有key值就会报错 16 17 Traceback (most recent call last): 18 19 File "<stdin>", line 1, in <module> 20 21 KeyError: ‘stu004‘ 22 23 >>> info.get("stu004") 24 25 >>> 26
多级字典嵌套及操作
1 av_catalog = { 2 3 "欧美":{ 4 5 "www.youporn.com": ["很多免费的,世界最大的","质量一般"], 6 7 "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], 8 9 "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], 10 11 "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"] 12 13 }, 14 15 "日韩":{ 16 17 "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"] 18 19 }, 20 21 "大陆":{ 22 23 "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] 24 25 } 26 27 } 28 29 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来" 30 31 print(av_catalog["大陆"]["1024"]) 32 33 #ouput 34 35 [‘全部免费,真好,好人一生平安‘, ‘服务器在国外,慢,可以用爬虫爬下来‘] 36 37 #嵌套了很多层 key尽量不写中文 38 39 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来" 40 41 print(av_catalog["大陆"]["1024"]) 42 43 #ouput[‘全部免费,真好,好人一生平安‘, ‘服务器在国外,慢,可以用爬虫爬下来‘] 44 45 print(av_catalog.values()) #打印所有得值 不包括key值 46 47 print(av_catalog.keys()) #打印所有得key 48 49 av_catalog.setdefault("taiwan",{"www.baidu.com":[1,2]}) #字典里有的不改变。没有的改变 50 51 print(av_catalog) 52 53 av_catalog.setdefault("taiwan",{"haha":[000]}) #字典里有 54 55 print(av_catalog) 56
程序练习
程序: 三级菜单
要求:
1. 打印省、市、县三级菜单
2. 可返回上一级
3. 可随时退出程序
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 4 menu = { 5 ‘北京‘:{ 6 ‘海淀‘:{ 7 ‘五道口‘:{ 8 ‘soho‘:{}, 9 ‘网易‘:{}, 10 ‘google‘:{} 11 }, 12 ‘中关村‘:{ 13 ‘爱奇艺‘:{}, 14 ‘汽车之家‘:{}, 15 ‘youku‘:{}, 16 }, 17 ‘上地‘:{ 18 ‘百度‘:{}, 19 }, 20 }, 21 ‘昌平‘:{ 22 ‘沙河‘:{ 23 ‘老男孩‘:{}, 24 ‘北航‘:{}, 25 }, 26 ‘天通苑‘:{}, 27 ‘回龙观‘:{}, 28 }, 29 ‘朝阳‘:{}, 30 ‘东城‘:{}, 31 }, 32 ‘上海‘:{ 33 ‘闵行‘:{ 34 "人民广场":{ 35 ‘炸鸡店‘:{} 36 } 37 }, 38 ‘闸北‘:{ 39 ‘火车战‘:{ 40 ‘携程‘:{} 41 } 42 }, 43 ‘浦东‘:{}, 44 }, 45 ‘山东‘:{}, 46 } 47 48 49 exit_flag = False 50 current_layer = menu 51 52 layers = [menu] 53 54 while not exit_flag: 55 for k in current_layer: 56 print(k) 57 choice = input(">>:").strip() 58 if choice == "b": 59 current_layer = layers[-1] 60 #print("change to laster", current_layer) 61 layers.pop() 62 elif choice not in current_layer:continue 63 else: 64 layers.append(current_layer) 65 current_layer = current_layer[choice]
集合是一个无序的,不重复的数据组合,它的主要作用如下:
l 去重,把一个列表变成集合,就自动去重了
l 关系测试,测试两组数据之前的交集、差集、并集等关系
常用操作
1 list_1 = [1,2,3,1,2,4,5,6] 2 3 list_2 = set(list_1) 4 5 list_3 = set([1,2,3,4,8,9,0]) 6 7 print(list_2,type(list_2)) 8 9 print(list_3,type(list_3)) 10 11 print( list_2.intersection(list_3) ) #取交集 12 13 print( list_2 & list_3) #交集 14 15 #print( list_2.intersection_update(list_3)) #交集后给list_2赋值 16 17 print( list_2.union(list_3) ) #取并集 18 19 print( list_2 | list_3) #并集 20 21 print( list_2.difference(list_3) ) #差集 22 23 print( list_2 - list_3) #差集 24 25 print( list_3.difference(list_2) ) #差集 26 27 print( list_2.issubset(list_3)) #子集 28 29 list_4 = set([1,2]) 30 31 print( list_4.issubset(list_1)) #4是1子集 32 33 print( list_2.symmetric_difference(list_3)) #对称差集 ,去掉了合集 34 35 print( list_2 ^ list_3) #对称差集 36 37 list_5 = set([10,15]) 38 39 print(list_2.isdisjoint(list_5)) #没交集,返回True 40 41 list_5.add(999) #添加 42 43 print(list_5) 44 45 list_2.remove(3) #没值会报错 46 47 list_2.discard(3) #没值不会报错 48
对文件操作流程
1. 打开文件,得到文件句柄并赋值给一个变量
2. 通过句柄对文件进行操作
3. 关闭文件
现有文件如下
文件操作:
1 #!/usr/bin/env python 2 # _*_ coding:utf-8 _*_ 3 4 #data = open("aige",encoding="utf-8").read() 5 # f = open("aige",encoding="utf-8") #文件句柄,就是文件的内存对象 6 # data = f.read() #读到文件末尾 7 # data2 = f.read() #从末尾开始读。没有任何内容了 8 # print(data) 9 # print("-------------",data2) 10 11 # f = open("aige2","w",encoding="utf-8") #创建一个文件。覆盖之前的文件名了 12 # 13 # f.write("我爱北京天安门\n") 14 # f.write("天安门上太阳升") 15 16 17 # f = open("aige2","a",encoding="utf-8") #追加 #也不能读 18 # f.write("我爱北京天安门") 19 # f.close() 20 # f = open("aige",encoding="utf-8") 21 # print(f.readline()) #一行行的读 22 # print(f.readline()) 23 # print(f.readline()) 24 # print(f.readline()) 25 # for i in range(5): 26 # print(f.readline()) 27 # print(f.readlines()) #生成列表 28 29 # for index,line in enumerate(f.readlines()): # f.readlines()只适合读小文件 #取消打印第十行 30 # if index == 9: 31 # print("分割线----------------------") 32 # continue 33 # print(line.strip()) 34 # count = 0 35 # for line in f: #效率高,比上面的高,上面是先加载整个文件到内存,下面是读一行删一行 36 # count += 1 37 # if count == 10: 38 # print("----------------") 39 # continue 40 # print(line) 41 # f = open("aige",encoding="utf-8") 42 # print(f.tell()) 43 # f.read(5) 44 # print(f.tell()) 45 # f.seek(0) 46 # print(f.tell()) 47 # print(f.encoding) 48 # print(f.fileno()) #返回文件编号 49 # f.seekable() #判断文件是否可以跳转 50 # f.readable() #判断文件是否可读 51 # f.flush() #刷 把内存的写入硬盘 52 f = open("aige","a", encoding="utf-8") 53 # f.seek(10) 54 # f.truncate(100) #截断 无论seek到哪,都是从头开始截 55 f.close() 56 57 58 59
打开文件的模式有:
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
http://www.cnblogs.com/yuanchenqi/articles/5956943.html
原文:http://www.cnblogs.com/can-H/p/6354313.html