Python学习笔记3(字符串、列表、元祖、字典、集合)
1.字符串
字符串是 Python 中最常用的数据类型。我们可以使用引号('或")来创建字符串。
创建字符串很简单,只要为变量分配一个值即可。例如:
1 name1 = 'zhang' 2 name2 = "yan"
特性:字符串不可修改。例如name1[0] = ‘Z’操作就不被允许,会报出如下错误:
1 TypeError: 'str' object does not support item assignment
但是name1[0]是可以读出‘z’这个字符的。如果想要修改字符串,那么就赋一个新的值给变量。
python的字符串内建函数
1 name1.capitalize() #把字符串的第一个字符大写 2 name1.upper() #小写全部变大写 3 name1.casefold() #大写全部变小写(可以有其他语言,比如德语) 4 name1.lower() #大写全部变小写(仅针对ASCII中的A-Z) 5 name1.swapcase() #反转大小写 6 name1.center(50,'*') #输出**********************zhang*********************** 7 name1.count('z') #统计z出现次数 8 name1.encode() #将字符串编码成bytes格式,字符串默认为UTF-8格式 9 name1.decode() #将bytes格式转换成字符串 10 name1.startswith('z') #判断字符串是否以z开头,返回True或False 11 name1.endswith("ng") #判断字符串是否以ng结尾,返回True或False 12 name1.find('a') #找到a,返回索引位置,若未找到,返回-1 13 name1.rfind('a') #从右边开始找 14 name1.index('a') #和find一样,只不过找不到的话会抛出异常 15 name1.rindex('a') #从右边开始找 16 name1.isalnum() #所有字符都是字母或数字则返回 True,否则返回 False 17 name1.isalpha() #所有字符都是字母则返回 True,否则返回 False 18 name1.isdecimal() #只包含十进制数字则返回 True 否则返回 False. 19 name1.isdigit() #只包含数字则返回 True 否则返回 False. 20 name1.isnumeric() #只包含数字字符则返回True,否则返回False. 21 name1.isspace() #只包含空格,则返回 True,否则返回 False. 22 name1.join(['a','b','c']) #参数传可迭代的对象,把所有对象以name1连接做新的字符串 23 >>>azhangbzhangc 24 name1.ljust(40,"-") 25 >>>'zhang-----------------------------' 26 name1.rjust(40,"-") 27 >>>'-----------------------------zhang' 28 29 30 maketrans 31 >>> intab = "aeiou" #This is the string having actual characters. 32 >>> outtab = "12345" #This is the string having corresponding mapping character 33 >>> trantab = str.maketrans(intab, outtab) 34 >>> 35 >>> str = "this is string example....wow!!!" 36 >>> str.translate(trantab) 37 'th3s 3s str3ng 2x1mpl2....w4w!!!' 38 39 max(name1) #返回name1中最大的字母 40 min(name1) #返回name1中最小的字母 41 42 name1.partition(str) #从str出现的第一个位置起,把字符串name1分成一个3元素的元组(string_pre_str,str,string_post_str),如果name1中不包含str则string_pre_str == name1. 43 name1.rpartition(str) #从右边开始找 44 45 name1.replace(str1,str2,num) #把name1中的str1替换为str2,如果num指定了,则不超过num次 46 name1.split(str,num) #以str为分隔符切片name1,如果 num有指定值,则仅分隔 num 个子字符串,以列表形式返回
2.列表
列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作。
列表的定义
names = ['zhangyan',"suping",'tom']
通过下标访问列表中的元素,下标从0开始计数
1 >>>names[0] 2 'zhangyan' 3 >>>names[2] 4 'tom' 5 >>>names[-1] 6 'tom' 7 >>>names[-2] #还可以倒着取 8 'suping'
切片:取多个元素
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> names = ["Alex","Tenglan","Eric","Rain","Tom","Amy"] 2 >>> names[1:4] #取下标1至下标4之间的数字,包括1,不包括4 3 ['Tenglan', 'Eric', 'Rain'] 4 >>> names[1:-1] #取下标1至-1的值,不包括-1 5 ['Tenglan', 'Eric', 'Rain', 'Tom'] 6 >>> names[0:3] 7 ['Alex', 'Tenglan', 'Eric'] 8 >>> names[:3] #如果是从头开始取,0可以忽略,跟上句效果一样 9 ['Alex', 'Tenglan', 'Eric'] 10 >>> names[3:] #如果想取最后一个,必须不能写-1,只能这么写 11 ['Rain', 'Tom', 'Amy'] 12 >>> names[3:-1] #这样-1就不会被包含了 13 ['Rain', 'Tom'] 14 >>> names[0::2] #后面的2是代表,每隔一个元素,就取一个 15 ['Alex', 'Eric', 'Tom'] 16 >>> names[::2] #和上句效果一样 17 ['Alex', 'Eric', 'Tom']
追加
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> names 2 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy'] 3 >>> names.append("我是新来的") 4 >>> names 5 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的']
插入
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> names 2 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] 3 >>> names.insert(2,"强行从Eric前面插入") 4 >>> names 5 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] 6 7 >>> names.insert(5,"从eric后面插入试试新姿势") 8 >>> names 9 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
修改
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> names 2 ['Alex', 'Tenglan', '强行从Eric前面插入', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的'] 3 >>> names[2] = "该换人了" 4 >>> names 5 ['Alex', 'Tenglan', '该换人了', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的']
删除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> del names[2] 2 >>> names 3 ['Alex', 'Tenglan', 'Eric', 'Rain', '从eric后面插入试试新姿势', 'Tom', 'Amy', '我是新来的'] 4 >>> del names[4] 5 >>> names 6 ['Alex', 'Tenglan', 'Eric', 'Rain', 'Tom', 'Amy', '我是新来的'] 7 >>> 8 >>> names.remove("Eric") #删除指定元素 9 >>> names 10 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', '我是新来的'] 11 >>> names.pop() #删除列表最后一个值 12 '我是新来的' 13 >>> names 14 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy']
扩展
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> names 2 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy'] 3 >>> b = [1,2,3] 4 >>> names.extend(b) 5 >>> names 6 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
拷贝
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> names 2 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3] 3 4 >>> name_copy = names.copy() 5 >>> name_copy 6 ['Alex', 'Tenglan', 'Rain', 'Tom', 'Amy', 1, 2, 3]
拷贝分浅拷贝和深拷贝之分,之后会单独写一篇来讲解。
统计
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> names 2 ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3] 3 >>> names.count("Amy") 4 2
排序&翻转
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> names 2 ['Alex', 'Tenglan', 'Amy', 'Tom', 'Amy', 1, 2, 3] 3 >>> names.sort() #排序 4 Traceback (most recent call last): 5 File "<stdin>", line 1, in <module> 6 TypeError: unorderable types: int() < str() #3.0里不同数据类型不能放在一起排序了,擦 7 >>> names[-3] = '1' 8 >>> names[-2] = '2' 9 >>> names[-1] = '3' 10 >>> names 11 ['Alex', 'Amy', 'Amy', 'Tenglan', 'Tom', '1', '2', '3'] 12 >>> names.sort() 13 >>> names 14 ['1', '2', '3', 'Alex', 'Amy', 'Amy', 'Tenglan', 'Tom'] 15 16 >>> names.reverse() #反转 17 >>> names 18 ['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1']
获取下标
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> names 2 ['Tom', 'Tenglan', 'Amy', 'Amy', 'Alex', '3', '2', '1'] 3 >>> names.index("Amy") 4 2 #只返回找到的第一个下标
3.元祖
元组其实跟列表差不多,也是存一组数,只不是它一旦创建,便不能再修改,所以又叫只读列表
创建元祖
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 tup1 = ('physics', 'chemistry', 1997, 2000); 2 tup1 = (); #创建空元祖 3 tup1 = (50,); #元组中只包含一个元素时,需要在元素后面添加逗号 4 5 >>> tup1 = ("all") 6 >>> print tup1 7 all 8 #输出字符串 all,这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号。所以,如果元组只有1个元素,就必须加一个逗号,防止被当作括号运算: 9 >>> tup1 = ("all",) 10 >>> print tup1 11 ('all',)
它只有2个方法,一个是count,一个是index,完毕。
4.字典
字典是另一种可变容器模型,且可存储任意类型对象。
字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示:
1 d = {key1 : value1, key2 : value2 }
键必须是唯一的,但值则不必。
值可以取任何数据类型,但键必须是不可变的,如字符串,数字或元组。
字典的特性:
- dict是无序的
- key必须是唯一的,天生去重
一个简单的字典实例:
1 info = { 2 'stu1101': "TengLan Wu", 3 'stu1102': "LongZe Luola", 4 'stu1103': "XiaoZe Maliya", 5 }
增加
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> info["stu1104"] = "苍井空" 2 >>> info 3 {'stu1102': 'LongZe Luola', 'stu1104': '苍井空', 'stu1103': 'XiaoZe Maliya', 'stu1101': 'TengLan Wu'}
修改
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> info['stu1101'] = "武藤兰" 2 >>> info 3 {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1101': '武藤兰'}
删除
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> info 2 {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1101': '武藤兰'} 3 >>> info.pop("stu1101") #标准删除姿势 4 '武藤兰' 5 >>> info 6 {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'} 7 >>> del info['stu1103'] #换个姿势删除 8 >>> info 9 {'stu1102': 'LongZe Luola'} 10 >>> 11 >>> 12 >>> 13 >>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'} 14 >>> info 15 {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'} #随机删除 16 >>> info.popitem() 17 ('stu1102', 'LongZe Luola') 18 >>> info 19 {'stu1103': 'XiaoZe Maliya'}
查找
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> info = {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya'} 2 >>> 3 >>> "stu1102" in info #标准用法 4 True 5 >>> info.get("stu1102") #获取 6 'LongZe Luola' 7 >>> info["stu1102"] #同上,但是看下面 8 'LongZe Luola' 9 >>> info["stu1105"] #如果一个key不存在,就报错,get不会,不存在只返回None 10 Traceback (most recent call last): 11 File "<stdin>", line 1, in <module> 12 KeyError: 'stu1105'
其他
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #values 2 >>> info.values() 3 dict_values(['LongZe Luola', 'XiaoZe Maliya']) 4 5 #keys 6 >>> info.keys() 7 dict_keys(['stu1102', 'stu1103']) 8 9 10 #setdefault 11 >>> info.setdefault("stu1106","Alex") 12 'Alex' 13 >>> info 14 {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} 15 >>> info.setdefault("stu1102","龙泽萝拉") 16 'LongZe Luola' 17 >>> info 18 {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} 19 20 21 #update 22 >>> info 23 {'stu1102': 'LongZe Luola', 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} 24 >>> b = {1:2,3:4, "stu1102":"龙泽萝拉"} 25 >>> info.update(b) 26 >>> info 27 {'stu1102': '龙泽萝拉', 1: 2, 3: 4, 'stu1103': 'XiaoZe Maliya', 'stu1106': 'Alex'} 28 29 #items 30 info.items() 31 dict_items([('stu1102', '龙泽萝拉'), (1, 2), (3, 4), ('stu1103', 'XiaoZe Maliya'), ('stu1106', 'Alex')]) 32 33 34 #通过一个列表生成默认dict,有个没办法解释的坑,少用吧这个 35 >>> dict.fromkeys([1,2,3],'testd') 36 {1: 'testd', 2: 'testd', 3: 'testd'}
循环
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #方法1 2 for key in info: 3 print(key,info[key]) 4 5 #方法2 6 for k,v in info.items(): #会先把dict转成list,数据里大时莫用 7 print(k,v)
5.集合
集合是一个无序的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集等关系
常用操作
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 s = set([3,5,9,10]) #创建一个数值集合 2 3 t = set("Hello") #创建一个唯一字符的集合 4 5 6 a = t | s # t 和 s的并集 7 8 b = t & s # t 和 s的交集 9 10 c = t – s # 求差集(项在t中,但不在s中) 11 12 d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中) 13 14 15 16 基本操作: 17 18 t.add('x') # 添加一项 19 20 s.update([10,37,42]) # 在s中添加多项 21 22 23 24 使用remove()可以删除一项: 25 26 t.remove('H') 27 28 29 len(s) 30 set 的长度 31 32 x in s 33 测试 x 是否是 s 的成员 34 35 x not in s 36 测试 x 是否不是 s 的成员 37 38 s.issubset(t) 39 s <= t 40 测试是否 s 中的每一个元素都在 t 中 41 42 s.issuperset(t) 43 s >= t 44 测试是否 t 中的每一个元素都在 s 中 45 46 s.union(t) 47 s | t 48 返回一个新的 set 包含 s 和 t 中的每一个元素 49 50 s.intersection(t) 51 s & t 52 返回一个新的 set 包含 s 和 t 中的公共元素 53 54 s.difference(t) 55 s - t 56 返回一个新的 set 包含 s 中有但是 t 中没有的元素 57 58 s.symmetric_difference(t) 59 s ^ t 60 返回一个新的 set 包含 s 和 t 中不重复的元素 61 62 s.copy() 63 返回 set “s”的一个浅复制