Day2-列表、字典、集合 |
作者:矮哥 归档:学习笔记 2017/01/28 |
目 录
1.1 列表、元组操作... 1
1.2 字符串操作... 4
1.3 字典操作... 5
1.4 集合操作... 9
1.5 文件操作... 9
1.6 字符编码与转码... 11
列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作
定义列表
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 "
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 "
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