一. 元组(tuple)
元组——只读列表,数据能被查询,不能修改。字符串的切片操作同样适用于元组。
1 s = ("ada", "jalksdj", "alkjsd") 2 3 # 注意,元组内只有一个值时,必须加个英文符逗号,比如下面也会自动打印出来 4 print(s[-2:-1]) # ('jalksdj',)
二. 列表(list)
列表中可以存放各种数据类型,比如:
s = [‘alex’,123,Ture,(1,2,3,’wusir’),[1,2,3,’小明’,],{‘name’:’alex’}]
列表的增删改查操作:
1 # 列表的增 2 3 s = [1,'a','b',2,3,'a'] 4 5 6 # insert —— 按照索引增加 7 s.insert(0, 55) 8 print(s) # [55, 1, 'a', 'b', 2, 3, 'a'] 9 10 11 # append —— 增加到最后 12 s.append("aaa") 13 print(s) # [55, 1, 'a', 'b', 2, 3, 'a', 'aaa'] 14 15 16 # extend —— 迭代的增 17 s.extend(["q, a, w"]) 18 print(s) # [55, 1, 'a', 'b', 2, 3, 'a', 'aaa', 'q, a, w'] 19 # 注意这里把列表的 5 个元素当作整体加进来了 20 # 与下面的对比 21 22 s.extend('a,b,c') 23 print(s) # [55, 1, 'a', 'b', 2, 3, 'a', 'aaa', 'q, a, w', 'a', ',', 'b', ',', 'c'] 24 # 这里通过迭代把 "a,b,c" 里的 5个元素(包括逗号) 都单独加进去了 25 26 s.extend("") # [55, 1, 'a', 'b', 2, 3, 'a', 'aaa', 'q, a, w', 'a', ',', 'b', ',', 'c'] 27 s.extend(" ") # [55, 1, 'a', 'b', 2, 3, 'a', 'aaa', 'q, a, w', 'a', ',', 'b', ',', 'c', " "] 28 # 迭代一个空字符串和一个只含空格的字符串的区别
1 # 列表的删 2 3 # pop() —— 默认删除最后一个值 4 # 括号里要是添加索引位置数字,则删除指定的元素,有返回值 5 s = [1, 3, 4, "a", "abc", "12sda"] 6 s1 = s.pop() 7 s2 = s.pop(1) 8 9 print(s1) # 12sda 10 print(s2) # 3 11 print(s) # [1, 4, 'a', 'abc'] 12 13 14 # del —— 按照指定位置删除,也可以切片删除,没有返回值 15 s = [1, 3, 4, "a", "abc", "12sda"] 16 del s[1] # [1, 4, 'a', 'abc', '12sda'] 17 del s[:2] # ['a', 'abc', '12sda'] 18 19 20 # remove —— 按照指定元素删除 21 s = [1, 3, 4, "a", "abc", "12sda"] 22 s.remove("a") 23 print(s) # [1, 3, 4, 'abc', '12sda'] 24 25 26 # clear() —— 直接清空整个列表 27 s = [1, 3, 4, "a", "abc", "12sda"] 28 s.clear() 29 print(s) # []
1 # 列表的改 2 # 通过索引号更改对应的值即可,也可使用切片 3 4 s = [1, "a", "b", 2, 3, "a"] 5 s[1] = "asd" 6 print(s) # [1, 'asd', 'b', 2, 3, 'a'] 7 s[1:3] = [123, "asdjlk"] 8 print(s) # [1, 123, 'asdjlk', 2, 3, 'a']
列表的其他操作
1 # count —— 统计某个元素在列表中出现的次数 2 3 s = ["q","w","q","r","t","y"] 4 print(s.count("q")) # 2
1 # index —— 从列表中找出某个值第一个匹配项的索引位置 2 3 s = ["q","w","r","t","y"] 4 print(s.index("r")) # 1
1 # sort —— 在原位置对列表进行排序 2 3 a = [2,1,3,4,5] 4 a.sort() # 他没有返回值,所以只能打印a 5 print(a) # [1, 2, 3, 4, 5] 6 7 8 # reverse —— 将列表中的元素反向存放 9 10 a = [2,1,3,4,5] 11 a.reverse() # 他没有返回值,所以只能打印a 12 print(a) # [5, 4, 3, 1, 2]
三. 字典(dict)
字典是Python中唯一的映射类型,采用键值对(key-value)的形式存储数据。
python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。
可哈希表示key必须是不可变类型,如:数字、字符串、元组。
字典(dictionary)是除列表之外python之中最灵活的内置数据结构类型。
列表是有序的对象结合,字典是无序的对象集合。
两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
1 # 字典的增 2 3 dic = {'age': 18, 'name': 'jin', 'sex': 'male'} 4 5 dic.setdefault('k','v') 6 print(dic) # {'age': 18, 'name': 'jin', 'sex': 'male', 'k': 'v'} 7 8 # setdefault —— 在字典中添加键值对,如果只有键那对应的值是none 9 # 但是如果原字典中存在设置的键值对,则他不会更改或者覆盖。 10 dic.setdefault('k','v1') 11 print(dic) # {'age': 18, 'name': 'jin', 'sex': 'male', 'k': 'v'}
1 # 字典的删 2 3 # pop() —— 有返回值 4 dic = {'age': 18, 'name': 'jin', 'sex': 'male', 'k': 'v'} 5 dic_pop = dic.pop("age") 6 print(dic_pop) # 18 7 print(dic) # {'name': 'jin', 'sex': 'male', 'k': 'v'} 8 9 # pop根据key删除键值对,并返回对应的值,如果没有key则返回默认返回值 10 dic_pop2 = dic.pop("a") # 报错,显示 "KeyError" : "a" 11 dic_pop2 = dic.pop("a", "无Key返回默认值") 12 print(dic_pop2) # 无Key返回默认值 13 print(dic) # {'name': 'jin', 'sex': 'male', 'k': 'v'} 14 15 16 # del —— 没有返回值 17 del dic["name"] 18 print(dic) # {'sex': 'male', 'k': 'v'} 19 20 21 # popitem() —— 随机删除字典中的某个键值对,并将删除的键值对以元组的形式返回 22 dic = {'age': 18, 'name': 'jin', 'sex': 'male', 'k': 'v'} 23 dic_pop3 = dic.popitem() 24 print(dic_pop3) # ('k', 'v') 25 print(dic) # {'age': 18, 'name': 'jin', 'sex': 'male'} 26 27 28 # clear() —— 清空字典 29 dic_clear = dic.clear() 30 print(dic_clear) # None 31 print(dic) # {}
1 # 字典的改 2 3 dic = {"name":"jin","age":18,"sex":"male"} 4 dic2 = {"name":"alex","weight":75} 5 6 # 将dic所有的键值对覆盖添加(相同的覆盖,没有的添加)到dic2中 7 dic2.update(dic) 8 print(dic2) # {'name': 'jin', 'weight': 75, 'age': 18, 'sex': 'male'}
1 # 字典的查 2 3 dic = {"name":"jin","age":18,"sex":"male"} 4 5 value1 = dic["name"] # 没有会报错 6 print(value1) # jin 7 8 value2 = dic.get("age") 9 print(value2) # 18 10 # 没有对应的 Key 则返回设定的返回值 11 value3 = dic.get("djffdsafg","默认返回值") 12 print(value3) # 默认返回值
1 # 字典的其他操作 2 3 dic = {"name":"jin","age":18,"sex":"male"} 4 item = dic.items() 5 print(item,type(item)) 6 # dict_items([('name', 'jin'), ('sex', 'male'), ('age', 18)]) <class 'dict_items'> 7 # 这个类型就是dict_items类型,可迭代的 8 9 keys = dic.keys() 10 print(keys,type(keys)) 11 # dict_keys(['sex', 'age', 'name']) <class 'dict_keys'> 12 13 values = dic.values() 14 print(values,type(values)) 15 # dict_values(['male', 18, 'jin']) <class 'dict_values'>
1 # 字典的循环 2 3 dic = {"name":"jin","age":18,"sex":"male"} 4 5 for key in dic: 6 print(key) 7 8 for item in dic.items(): 9 print(item) 10 11 for key,value in dic.items(): 12 print(key,value)
四. 集合(set)
集合和字典一样,是无序的。
集合有一点就是它是不重复的数据集合,它里面的元素是可哈希的(不可变类型)
但是集合本身是不可哈希(所以集合做不了字典的键)的。
以下是集合最重要的两点:
去重,把一个列表变成集合,就自动去重了。
关系测试,测试两组数据之前的交集、差集、并集等关系。
1 # 集合的创建 2 3 set1 = set({1,2,'barry'}) 4 set2 = {1,2,'barry'} 5 6 print(set1,set2) # {1, 2, 'barry'} {1, 2, 'barry'}
1 # 集合的增 2 3 set1 = {'alex','wusir','ritian','egon','barry'} 4 set1.add('景女神') 5 print(set1) # {'ritian', 'wusir', 'barry', '景女神', 'alex', 'egon'} 6 7 8 #update:迭代着增加,注意看与前面的区别 9 set1.update('A') 10 print(set1) # {'ritian', 'wusir', 'barry', '景女神', 'A', 'alex', 'egon'} 11 12 set1.update('老师') 13 print(set1) # {'ritian', 'wusir', '师', 'barry', '景女神', 'A', 'alex', '老', 'egon'} 14 15 set1.update([1,2,3]) 16 print(set1) 17 # {1, 2, 3, 'ritian', 'wusir', '师', 'barry', '景女神', 'A', 'alex', '老', 'egon'} 18 # 可以看出与列表的迭代的增类似
1 # 集合的删 2 3 set1 = {'alex','wusir','ritian','egon','barry'} 4 5 # 删除一个元素 6 set1.remove('alex') 7 print(set1) # {'ritian', 'wusir', 'barry', 'egon'} 8 9 # 随机删除一个元素 10 set_pop = set1.pop() 11 print(set_pop) # ritian 12 print(set1) # {'wusir', 'barry', 'egon'} 13 14 # 清空集合 15 set1.clear() 16 print(set1) # set() 17 18 # 删除集合 19 del set1 20 print(set1) # 报错
集合的其他操作
1 # 交集(& 或者 intersection) 2 3 set1 = {1,2,3,4,5} 4 set2 = {4,5,6,7,8} 5 6 print(set1 & set2) # {4, 5} 7 print(set1.intersection(set2)) # {4, 5} 8 9 10 # 反交集 (^ 或者 symmetric_difference) 11 12 set1 = {1,2,3,4,5} 13 set2 = {4,5,6,7,8} 14 15 print(set1 ^ set2) # {1, 2, 3, 6, 7, 8} 16 print(set1.symmetric_difference(set2)) # {1, 2, 3, 6, 7, 8}
1 # 并集 (| 或者 union) 2 3 set1 = {1,2,3,4,5} 4 set2 = {4,5,6,7,8} 5 6 print(set1 | set2) # {1, 2, 3, 4, 5, 6, 7,8} 7 print(set2.union(set1)) # {1, 2, 3, 4, 5, 6, 7,8}
1 # 差集 (- 或者 difference) 2 3 set1 = {1,2,3,4,5} 4 set2 = {4,5,6,7,8} 5 6 print(set1 - set2) # {1, 2, 3} 7 print(set1.difference(set2)) # {1, 2, 3} 8 9 print(set2 - set1) # {8, 6, 7} 10 print(set2.difference(set1)) # {8, 6, 7}
1 # 子集与超集 2 3 set1 = {1,2,3} 4 set2 = {1,2,3,4,5,6} 5 6 # 这两个相同,都是说明set1是set2子集。 7 print(set1 < set2) # True 8 print(set1.issubset(set2)) # True 9 10 11 # 这两个相同,都是说明set2是set1超集。 12 print(set2 > set1) # True 13 print(set2.issuperset(set1)) # True
1 # frozenset —— 不可变集合,让集合变成不可变类型 2 3 s = frozenset('barry') 4 5 print(s, type(s)) 6 # frozenset({'b', 'y', 'a', 'r'}) <class 'frozenset'>
五. 基础数据类型总结
按存储空间的占用分(从低到高)
数字 字符串 集合:无序,即无序存索引相关信息 元组:有序,需要存索引相关信息,不可变 列表:有序,需要存索引相关信息,可变,需要处理数据的增删改 字典:无序,需要存key与value映射的相关信息,可变,需要处理数据的增删改
按存值个数区分
标量/原子类型 | 数字,字符串 |
容器类型 | 列表,元组,字典 |
按可变不可变区分
可变 | 列表,字典 |
不可变 | 数字,字符串,元组,布尔值 |
按访问顺序区分
直接访问 | 数字 |
顺序访问(序列类型) | 字符串,列表,元组 |
key值访问(映射类型) | 字典 |
六. for -- enumerate -- range 的用法
1 # for 循环 —— 按顺序循环可迭代对象的内容 2 3 msg = '老男孩python是全国范围内最好的python培训机构' 4 for item in msg: 5 print(item) 6 7 8 li = ['alex','银角','女神','egon','太白'] 9 for i in li: 10 print(i) 11 12 13 dic = {'name':'太白','age':18,'sex':'man'} 14 for k,v in dic.items(): 15 print(k,v)
1 # enumerate —— 枚举 2 # 对于一个可迭代、可遍历的对象,enumerate 将其组成一个索引序列 3 # 利用它同时获得索引和值 4 5 li = ['alex','银角','女神','egon','太白'] 6 7 for i in enumerate(li): 8 print(i) 9 # (0, 'alex') 10 # (1, '银角') 11 # (2, '女神') 12 # (3, 'egon') 13 # (4, '太白') 14 15 for index,name in enumerate(li,1): 16 print(index,name) 17 # 1 alex 18 # 2 银角 19 # 3 女神 20 # 4 egon 21 # 5 太白 22 23 # 起始位置默认是0,可更改 24 for index, name in enumerate(li, 100): 25 print(index, name) 26 # 100 alex 27 # 101 银角 28 # 102 女神 29 # 103 egon 30 # 104 太白
1 # range —— 指定范围,生成指定数字 2 3 for i in range(1,10): 4 print(i) 5 6 for i in range(1,10,2): # 步长 7 print(i) 8 9 for i in range(10,1,-2): # 反向步长 10 print(i)