004 Python数据类型
-
l = [1, 2, 3, 4, 5, 6]
int
# 正向步长
print(l[0:3:1])
# 反向步长
print(l[2::-1])
# 通过索引取值实现列表翻转
print(l[::-1])
1 # int可以将纯整数构成的字符串转换成整型,若包含其它非整数符号则会报错 2 s = '123' 3 res = int(s) 4 print(res, type(res)) 5 6 # s = '12.3' 7 # res = int(s) 8 # print(res, type(s)) 9 10 # 十进制与其它进制之间的相互转换 11 # 十进制转其它进制 12 print(bin(3)) # 0b11 13 print(oct(9)) # 0o11 14 print(hex(17)) # 0x11 15 16 # 其它进制转十进制 17 print(int('0b11', 2)) 18 print(int('0o11', 8)) 19 print(int('0x11', 16)) 20 21 # float同样可以用来做数据类型转换 22 s = '12.3' 23 res = float(s) 24 print(res, type(res))
- str
1 # 字符串的定义:用单引号'',双引号"",三引号""""""引起来的内容 2 name1 = 'jack' 3 name2 = "Bob" 4 name3 = """我们是一家人""" 5 6 name4 = '''我们都有一个家,名字叫中国''' 7 8 print(name1, name2, name3, name4) 9 10 # 字符串的数据类型转换:任何类型都可以转成字符串,格式:str(任意类型数据) 11 # 字典和集合都是用{}大括号括起来的 12 # 列表 13 print(str([1, 2, 3])) 14 # 字典 15 print(str({'name': 'egon', 'age': 18})) 16 # 元组 17 print(str((1, 2, 3))) 18 # 集合 19 print(str({1, 2, 3, 4})) 20 21 # 字符串的使用: 22 # 字符串按索引取值 23 24 str1 = 'hello Python hello Java' 25 # 正向取值 26 print(str1[6]) # P 27 28 # 反向取值 29 print(str1[-2]) # 0 30 31 # 字符串不支持按照索引去修改 32 # str1[5] = 'X' # 报错'str' object does not support item assignment 33 34 # 字符串切片(顾头不顾尾,步长) 35 36 # 正向切 37 print(str1[0:9]) 38 # 正向切+步长 39 print(str1[0:9:2]) 40 # 反向切 41 print(str1[-4:-1]) # 顾头不顾尾,所以娶不到第四个 42 # 反向切+步长 43 print(str1[::-1]) # avaJ olleh nohtyP olleh 44 print(str1[:5:-1]) # avaJ olleh nohtyP 45 print(str1[:6:-1]) # avaJ olleh nohty 46 print(str1[5::-1]) # olleh 47 print(str1[6::-1]) # P olleh 48 49 # 获取字符串长度即字符的个数(但凡存在于引号内的都算作字符) 50 print(len(str1)) # 23 51 52 # 成员运算 53 print('hello' in str1) 54 print('hi' not in str1) 55 56 # 移除字符串内首尾制定的字符(默认移除空格) 57 str2 = ' Life is short ' 58 print(str2.strip()) # Life is short 59 str3 = '***Life is short ***' 60 print(str3.strip('*')) 61 62 # 切分split(默认切分是按照空格来切分),切割完是一个列表list 63 print('hello world'.split()) 64 print('127.0.0.1'.split('.')) 65 'hello world'.split() 66 67 # 循环取出字符串中的字符 68 str4 = '今天你要嫁给我吗?今天你要嫁给我吗?' 69 70 for x in str4: 71 print(x) 72 73 # strip(),lstrip(),rstrip() 74 # strip():移除字符串左右两边的字符,默认移除空格,可加参数,左右两边有多少移除多少 75 # lstrip():移除字符串左边的字符,默认移除空格 76 # rstrip():移除字符串右边的字符,默认移除空格 77 str5 = '&&&hello world&&&' 78 print(str5.strip('&')) 79 print(str5.rstrip('&')) 80 print(str5.lstrip('&')) 81 82 # lower(),upper() 83 # lower():将字符串中的所有字符转换成小写 84 # upper():将字符串中的所有字符转换成大写 85 str6 = 'My name is Bob' 86 print(str6.upper()) 87 print(str6.lower()) 88 89 # stratwith():判断字符串是否以括号内的字符串开始 90 # endwith():判断字符串是否以括号内的字符串结束 91 str7 = 'hello world' 92 print(str7.startswith('h')) 93 print(str7.startswith('hello')) 94 print(str7.startswith('world')) 95 96 print(str7.endswith('d')) 97 print(str7.endswith('world')) 98 print(str7.endswith('hello')) 99 100 # 字符串的格式化输出:format 101 print('my name is {name}, my age is {age}'.format(name='lijipeng', age=18)) 102 print('my name is {name}, my age is {name}'.format(name='lijipeng', age=18)) 103 # print('my name is {name}, my age is {age}'.format(name='lijipeng')) #字符串中的age没有被赋值,报错 104 105 # format的其它用法1类似于%s,按位置给值 106 print('my name is {},my age is {}'.format('lijipeng', 18)) 107 108 # format的其它用法2:将format中的参照看成一个列表,然后按照{索引取值} 109 print('my name is {0}, my age is {1}'.format('lijipeng', 18)) 110 print('my name is {0}, my age is {0}'.format('lijipeng', 18)) 111 print('my name is {1}, my age is {0}'.format('lijipeng', 18)) 112 113 # split,rsplit(默认是从左边切) 114 print('127.0.0.1'.split('.', 1)) 115 print('127.0.0.1'.rsplit('.', 3)) 116 print('127.0.0.1'.rsplit('.', 4)) # 只能切三次,但是切了四次也不会报错 117 118 # join 从可迭代的对象中取出多个字符串,然后按照指定的分隔符进行拼接 119 # join前是拼接符号 '%' '|' '&&&'是一个字符串 120 # join后是字符串列表 'hello world' ['1','2','3'] ['a','b','c'] 121 print('%'.join('hello world')) 122 print('|'.join(['1', '2', '3'])) 123 print('&&&'.join(['a', 'b', 'c'])) 124 125 # replace(可以部分也可以全部替换) 用新的字符串替换旧的字符串从而形成一个新的字符串 126 # 替换的是字符串里面的某些字符,old和new都应该是字符串 127 str8 = 'my name is jack, my age is 18!' 128 print(str8.replace('18', '73')) 129 print(str8.replace('my', 'MY', 1)) 130 print(str8.replace('my', 'MY', 2)) 131 132 # isdigit:判断字符串中是否由纯数字组成 133 str9 = '123456789' 134 str10 = '12345g678910' 135 print(str9.isdigit()) 136 print(str10.isdigit()) 137 138 # 了解操作 139 # find rfind index rindex count 140 # find 从指定范围内查找子字符串的起始索引,找到返回起始索引,找不到返回-1 141 142 print('hello world'.find('he', 0, 10)) 143 print('hello world'.find('he', 1, 10)) 144 print('hello world'.find('o', 1, 10)) 145 146 # rfind 从指定范围内查找子字符串的起始索引,找到返回起始索引,找不到返回-1 147 print('hello world'.rfind('he')) 148 print('hello world'.rfind('l')) 149 print('hello world'.rfind('ll')) 150 print('hello world'.rfind('lll')) 151 152 # index 从指定范围内查找子字符串的起始索引,找到返回起始索引,找不到报错 153 print('hello world'.index('he')) 154 # print('hello world'.index('he', 1, 10)) #会报错 155 # print('hello world'.index('ll', 1, 3)) # 会报错,因为取不到3索引 156 print('hello world'.index('ll', 1, 4)) # 不会报错,可以取到4索引 157 158 # rindex 从指定范围内查找子字符串的起始索引,找到返回起始索引,找不到报错 159 print('hello world'.rindex('l')) 160 # print('hello world'.rindex('l',10,11)) # 161 162 # count:统计字符串在大字符串中出现的次数 163 print('hello world'.count('l')) # 3 164 print('hello world'.count('l', 1, 5)) # 2 165 print('hello world'.count('ll')) # 1 166 print('hello world'.count('lll')) # 0 167 168 # center,ljust,rjust,zfill 169 170 # center:字符串居中操作 171 # __width第一个参数为返回字符串的总长度 172 # __filechar第二个参数为不够用什么字符来填充 173 # 本身字符串的长度已经超过了__width,则直接展示本身即可 174 print('lijipeng'.center(30, '-')) # -----------lijipeng----------- 175 print('lijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipeng'.center(30, '-')) 176 177 # ljust:字符串左对齐展示,不够的用__filechar填充,本身字符串的长度已经超过了__width,则直接展示本身即可 178 print('lijipeng'.ljust(30, '-')) 179 # rjust:字符串右对齐展示,不够的用__filechar填充,本身字符串的长度已经超过了__width,则直接展示本身即可 180 print('lijipeng'.rjust(30, '-')) 181 print('lijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipeng'.ljust(30, '-')) 182 print('lijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipeng'.rjust(30, '-')) 183 184 # zfill:字符串右对齐展示,不够的用0补充,本身字符串的长度已经超过了__width,则直接展示本身即可 185 print('lijipeng'.zfill(50)) 186 print('lijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipenglijipeng'.zfill(30)) 187 188 # expandtabs:修改制表符代表的空格数 189 str11 = 'lijipeng\tworld' 190 print(str11) 191 print('lijipeng\tworld'.expandtabs(1)) 192 print('lijipeng\tworld'.expandtabs(2)) 193 print('lijipeng\tworld'.expandtabs(4)) 194 print('lijipeng\tworld'.expandtabs(5)) 195 print('lijipeng\tworld'.expandtabs(6)) 196 197 # expitalize,swapcase,title 198 # expitalize:首字母大写,本身字符串就是大写的话返回原来的字符串 199 print('hello world'.capitalize()) 200 print('Hello world'.capitalize()) 201 202 # swapcase:大小写翻转 203 print('My name is lijipeng, My age is 18'.swapcase()) 204 205 # title:单词首字母大写 206 print('My name is lijipeng,My age is 18'.title()) 207 208 # is数字系列 209 # 数字的四种格式:bytes,unicode,中文数字,罗马数字 210 num1 = b'1' 211 num2 = u'1' 212 num3 = '一' 213 num4 = 'I' 214 # isdigit: 215 # 用法1:判断单个字符是否为数字 216 # 用法2:判断字符串是否全部由数字组成 217 print(num1.isdigit()) # True 218 print(num2.isdigit()) # True 219 print(num3.isdigit()) # False 220 print(num4.isdigit()) # False 221 222 # isdecimal 223 # 用法:用来检查字符串中的所有字符是否都是十进制数字字符 224 print(num1.isdigit()) # bytes类型的数字没有isdecimal方法 225 print(num2.isdecimal()) # True 226 print(num3.isdecimal()) # False 227 print(num4.isdecimal()) # False 228 229 # isnumeric:用来检查字符串是否只包含数字字符 230 print(num1.isdigit()) 231 print(num2.isnumeric()) # True 232 print(num3.isnumeric()) # True 233 print(num4.isnumeric()) # False 234 235 # 总结:最常用的就是isdigit,可以判断bytes和unicode类型,如果要判断中文数字或罗马数字则需要使用isnumeric 236 237 # is其它 238 name = 'tony123' 239 # isalnum:字符串中既可以包含数字也可以包含字母 240 print(name.isalnum()) 241 # isalpha:字符串中只包含字母 242 print(name.isalpha()) 243 # isidentifier:用来判断字符串中是否是合法的标识符 244 name1 = 'tony123_' 245 name2 = 'tony123_$' 246 name3 = 'print' 247 name4 = '123tony' 248 print(name1.isidentifier()) 249 print(name2.isidentifier()) 250 print(name3.isidentifier()) 251 print(name4.isidentifier()) 252 253 # islower:判断字符串中是否都是纯小写 254 # isupper:判断字符串中是否都是纯大写 255 print('my name is lijipeng'.islower()) 256 print('my name is lijipeng'.isupper()) 257 print('my name is LIJIPENG'.isupper()) 258 print('my name is LIJIPENG'.isupper()) 259 print('MY NMAE IS LIJIPENG'.isupper()) 260 261 # isspace:判断字符串中是否全是空格 262 print(' '.isspace()) # True 263 print(' womenshi '.isspace()) # False 264 print('\t'.isspace()) # True 265 266 # istitle:判断字符串中单词首字母是否是大写 267 print('My Name Is Ljipeng'.istitle()) 268 print('my Name Is hhaha'.istitle())
1 # 列表定义:在[]内,用逗号分隔开多个任意数据类型的值 2 3 l1 = [1, 'test', [2, 3]] # 本质就是l1 = list([1, 'test', [2, 3]]) 4 5 # 列表类型转换 6 # 但凡能被for循环遍历的数据类型都可以传给list()转换成列表类型 7 # list()会跟for循环一样,遍历出数据类型中包含的每一个元素,然后放到列表中 8 9 print(list('hello world')) # 字符串类型数据'hello world'可以被for循环遍历,所以可以传给list()转换成列表类型,print打印列表则会展示一个字符列表 10 print(list([1, 2, 3])) # 通过list()转化后打印列表 [1, 2, 3] 11 print([1, 2, 3]) # 直接打印列表 [1, 2, 3] 12 print(list({'name': 'egon', 13 'age': 18})) # 字典{'name':'egon','age':18}可以被for循环遍历,遍历得到的是key值,所以可以传给list()转换成列表类型,print打印列表则会展示一个key的列表 14 print(list((1, 2, 3))) # 元组(1, 2, 3)也可以被for循环遍历,所以可以传给list()转换成列表类型,print打印列表展示[1, 2, 3] 15 print(list({1, 2, 3, 4})) # 集合{1, 2, 3, 4}可以被for循环遍历,所以可以传给list()转换成列表类型,print打印列表展示[1, 2, 3, 4] 16 17 # 列表按索引取值 18 hobbies = ['basketball', 'football', 'sing'] 19 print(hobbies[0]) # basketball 正向取值 20 print(hobbies[-1]) # sing 反向取值 21 22 # 列表按照索引修改指定位置的值,索引不存在则会报错list assignment index out of range 23 hobbies[1] = 'read' 24 print(hobbies) 25 # hobbies[3] = 'test' # 列表有三个值,索引最大到2,所以会报错 26 27 # 列表切片 28 # 顾头不顾尾:取出索引0-2的元素 29 print(hobbies[0:2]) # 取不到2 30 print(hobbies[0:3]) 31 # 步长 32 print(hobbies[0:3:2]) # ['basketball', 'sing'] 这里的2指的是步长,首次取0索引,第二次取2索引 33 34 # 列表长度len 35 print(len(hobbies)) 36 37 # 成员运算 in not in 38 print('basketball' in hobbies) 39 print('sing' not in hobbies) 40 41 # 添加元素 42 # 尾部追加元素append 43 hobbies.append('sleep') # 在列表尾部追加'sleep'元素 44 print(hobbies) 45 46 # 一次性在尾部添加多个元素extend,括号内应该是一个列表 47 hobbies.extend(['eat', 'movies']) 48 print(hobbies) 49 50 # 在指定位置插入元素insert,如果输入的索引超过了本身的最大索引,则会默认加在最后面 51 hobbies.insert(0, 'heihei') 52 hobbies.insert(7, 'haha') 53 hobbies.insert(10, 'xixi') 54 hobbies.insert(-2, '666') 55 print(hobbies) 56 57 # 删除元素 58 # del listname[索引值] 删除指定索引的值,没有返回值,如果该索引值不存在,则会报错list assignment index out of range 59 del hobbies[0] 60 print(hobbies) 61 62 del hobbies[1] 63 # del hobbies[10] # 报错 64 print(hobbies) 65 66 # listname.pop()默认删除列表最后一个元素,并将删除的值返回,括号内可以指定索引值来删除对应的元素 67 print(hobbies.pop()) 68 print(hobbies) 69 70 print(hobbies.pop(2)) 71 print(hobbies) 72 73 # remove()括号内指名道姓要删除某个元素,返回值为None 74 print(hobbies.remove('sing')) 75 print(hobbies) 76 77 # reverse() 颠倒列表内元素顺序,返回值为None 78 print(hobbies.reverse()) 79 print(hobbies) 80 # sort() 给列表内所有元素排序,返回值为None,reverse默认值为False,从小到大排序 81 print(hobbies.sort()) 82 print(hobbies) 83 print(hobbies.sort(reverse=False)) 84 print(hobbies) 85 print(hobbies.sort(reverse=True)) 86 print(hobbies) 87 88 # 数字可以直接比较大小,字符串、列表也可以比较大小,原理相同都是比较相同位置的元素的大小,如果分出大小,则无需比较下一个元素 89 print([1, 2, 3] < [2]) #True 90 print('abc' < 'ABC') #False 91 92 # for循环遍历列表中的值 93 for x in hobbies: 94 print(x)
1 l = [1, 2, 3, 4, 5, 6] 2 # 正向步长 3 print(l[0:3:1]) 4 # 反向步长 5 print(l[2::-1]) 6 7 # 通过索引取值实现列表翻转 8 print(l[::-1])
1 # 元组作用:元组和列表相似,也可以存多个任意类型的数据,不同之处在于元组的元素不能修改,即元组相当于不可变的列表,用来记录多个固定不允许修改的值,单纯只是为了取 2 # 元组其实就是一个元素不可变的列表,只能用来取,元素不可更改。 3 4 # 元组定义,如果元组内只有一个值,则必须得有一个逗号,否则()就只是包含的意思,而非定义元组 5 countries = ('中国', '美国', '英国') # 本质就是tuple('中国','美国','英国') 6 tests = ('数学') # 元组中只有一个值,必须得有逗号,不然就是包含的意思 7 tests1 = (1,) 8 print(countries, type(countries)) 9 print(tests, type(tests)) # 数学 <class 'str'> 10 print(tests1, type(tests1)) # (1,) <class 'tuple'> 11 12 # 类型转换:但凡能被for循环遍历的数据类型都可以传给tuple()转换成元组类型 13 14 print(tuple('hello world')) # 字符串 15 print(tuple([1, 2, 3])) # 列表 16 print(tuple({'name': 'egon', 'age': 18})) # 字典('name', 'age') 17 print(tuple((1, 2, 3))) # 元组 18 print(tuple({1, 2, 3, 4})) # 集合 19 20 # tuple()会跟for循环一样,遍历出数据类型中包含的每一个元素,然后放在元组中 21 22 # 元组使用 23 24 tuple1 = (1, 2, 3, 'hello', 23.4, [1, 2], {'name': 'egon', 'age': 18}) 25 # 按索引取值,只能取,不能改,改的话会报错 26 print(tuple1[0]) 27 print(tuple1[1]) 28 print(tuple1[2]) 29 print(tuple1[3]) 30 print(tuple1[4]) 31 print(tuple1[5]) 32 print(tuple1[6]) 33 34 print(tuple1[-1]) 35 # tuple1[2] = '' #报错 36 # 切片 37 print(tuple1[0:3:1]) 38 # 长度 39 print(len(tuple1)) 40 # 成员运算 41 print(1 in tuple1) 42 print('helloworld' in tuple1) 43 # 循环 44 for tup in tuple1: 45 print(tup)
- dict
1 # 字典的定义方式 2 # 在{}内用逗号分隔开的多个元素,每个元素都是key:value的形式,value可以是任意数据类型,而key则必须是不可变类型,通常key是str类型,因为str类型对value有描述性功能。 3 # 字典定义格式1 4 info = {'name': 'jack', 'age': 18, 'salary': 20000.4} # 本质是dict({'name':'jack','age':18,'salary':20000.4}) 5 # 字典定义格式2:就是将{}换成了(),前面加了dict转换,()内格式为key=value中间用逗号隔开 6 # 前面需要用dict强转在()内用逗号分隔开的多个元素,每个元素都是key=value的形式,value可以是任意数据类型,而key则必须是不可变类型,通常key是str类型,因为str类型可以对value有描述性功能。 7 info = dict(name='jack', age=18, salary=20000.4) 8 # 字典类型转换 9 # 转换1:通过dict()的形式强制类型转换,()内是一个列表,列表内每个元素都是一个列表,格式为key,value 10 info1 = dict([['name', 'tony'], ['age', 18]]) 11 print(info1) 12 13 # 转换2:通过调用空字典{}的frromkeys方法,相当于是初始化了字典的key,value的初始化还得通过赋值操作 14 # 参数1是一个key的元组 15 # 参数2是一个value值, 16 info2 = {}.fromkeys(('name', 'age', 'sex'), None) 17 info['name'] = 'jack' 18 info['age'] = 18 19 info['sex'] = 'male' 20 print(info2) 21 # 字典使用 22 23 # 按key取值 24 dict1 = {'name': 'jack', 25 'age': 19, 26 'hobbies': ['basketball', 'football']} 27 28 print(dict1['name']) 29 print(dict1['hobbies'][0]) 30 31 # 赋值操作 32 # 如果key不存在于字典中,则会新加key:value 33 dict1['height'] = 181.5 # key不存在就新加一个key:value 34 dict1['name'] = 'Bob' # key存在就修改原来的值 35 print(dict1) 36 37 # 统计字典长度,这里统计的是key的个数 38 print(len(dict1)) 39 40 # 成员运算in not in 41 # 判断某个值是否是该字典的key 42 print('name' in dict1) 43 print('gender' in dict1) 44 print('name' not in dict1) 45 print('gender' not in dict1) 46 47 # 字典的删除pop 48 # 通过指定字典的key来删除key对应的键值对 49 # 返回值为所删除key对应的value值 50 print(dict1.pop('height')) 51 print(dict1) 52 53 # 获取字典所有的key,所有的value,所有的键值对 54 # 获取所有的key,方式字典名.keys 55 # 返回值是一个被dict_keys强制转换的列表 56 print(dict1.keys()) # dict_keys(['name', 'age', 'hobbies']) 57 58 # for 循环遍历所有的key 59 for key in dict1.keys(): 60 print(key) 61 62 # 获取字典所有的value,方式:字典名.values 63 # 返回值是一个被dict_values强制转换的列表 64 print(dict1.values()) # dict_values(['Bob', 19, ['basketball', 'football']]) 65 66 # for 循环遍历所有的value 67 for value in dict1.values(): 68 print(value) 69 70 # 获取字典所有的键值对,方式:字典名.items 71 # 返回值是一个被dict_items强制转换的列表,列表中每个元素都是一个元组,元组内一个是key,一个是value 72 print(dict1.items()) # dict_items([('name', 'Bob'), ('age', 19), ('hobbies', ['basketball', 'football'])]) 73 74 for item in dict1.items(): 75 print(item[0]) 76 print(item[1]) 77 78 # get() 79 # 通过key来取值 80 # key存在则获取key对应的value值 81 # 字典取值建议使用get方法 82 print(dict1.get('name')) 83 print(dict1.get('age')) 84 print(dict1.get('hobbies')) 85 # key不存在则返回None 86 print(dict1.get('gender')) 87 # key不存在也可以返回默认值 88 print(dict1.get('gender', 'male')) 89 90 # pop删除元素上面已经演示过了 91 # popitem(),只要执行一次就会随机删除一次 92 # 随机删除一个键值对,并将删除的键值放在元组中返回 93 print(dict1) 94 # print(dict1.popitem()[0],dict1.popitem()[1]) # 首次删除删除的是hobbies对应的键值对,第二次删除删除的是age对应的键值对hobbies 19 95 # print(dict1.popitem()[1]) 96 97 for item in dict1.popitem(): 98 print(item) 99 print(item[0]) 100 print(item[1]) 101 102 # update 103 # 用新字典更新旧字典,有则改之,无则添加。定义方式:原字典名.update()()内是一个字典 104 105 print(dict1) 106 dict1.update({'name': 'jack', 'gender': 'male', 'hobbies': ['basketball', 'football']}) 107 print(dict1) 108 109 # fromkeys 110 # 必须得有一个键的列表集合,不然报错 111 dic = dict1.fromkeys(['key']) 112 print(dic) 113 114 # setdefault 115 # 格式: 116 # 当key不存在时,则新增键值对,默认加在最后,并将键值对的value值返回 117 print(dict1.setdefault('salary', 10000.3)) # 10000.3 118 print(dict1) 119 120 # 当key存在时,则原字典不改变,返回值为键对应的value值 121 print(dict1.setdefault('name', 'NIUPI')) # jack
- list
1 # 集合作用: list tuple dict 都可以存放多个值,但是集合主要是用来去重和关系运算 2 3 # 集合定义:在{}内用逗号分隔开的多个元素 4 5 # 集合特点: 6 # 1、集合内的每个元素都是不可变类型 7 # 2、集合内的元素是不可以重复的 8 # 3、集合内的元素是无序的,也就是不可以通过索引取值 9 10 s1 = {1, 2, 3, 4} # 本质是s1 = set({1,2,3,4}) 11 print(s1) 12 s1 = set({1, 2, 3, 4}) 13 print(s1) 14 # print(s1[0]) # 是不可以通过下标访问的,会报错TypeError: 'set' object is not subscriptable 15 16 # 对于列表、元组类型来说是索引对应值,对于字典来说是key对应值,都可以取到对应的单个值。而集合类型没有索引也没有key与值对应,所以无法取到单个值 17 18 # 集合主要是用来去重和关系运算,没有取出单个值的需求。 19 20 # {}既可以用来定义字典也可以用来定义集合,字典{}内是key:value的格式,如果定义一个空字典和空集合 21 s2 = {} # 定义空字典 22 s3 = set() # 定义空集合 23 print(s2, type(s2)) 24 print(s3, type(s3)) 25 26 # 列表类型转换 27 # 但凡能被for循环遍历的数据类型都可以传给set()转换成集合类型 28 # 强调:for循环遍历出的每个元素必须是不可变类型 29 30 s1 = set([1, 2, 3, 4]) # 列表 31 s2 = set((1, 2, 3, 4)) # 元组 32 s3 = set('hello world') # 字符串 33 s4 = set({'name': 'egon', 'age': 18}) # 字典 34 35 print(s1, type(s1)) 36 print(s2, type(s2)) 37 print(s3, type(s3)) 38 print(s4, type(s4)) 39 40 # 关系运算 41 42 num1 = {1, 2, 3, 4} 43 num2 = {5, 6, 3, 4} 44 45 # 一个集合包含num1和num2的所有数字(合集/并集) 46 num3 = num1 | num2 47 print(num3) 48 49 # 求两个数字集合的共同数字(交集) 50 num4 = num1 & num2 51 print(num4) 52 53 # 求num1独有的数字(差集) 54 num5 = num1 - num2 55 print(num5) 56 57 # 求num2独有的数字(差集) 58 num6 = num2 - num1 59 print(num6) 60 61 # 求两个用户独有的好友们(对称差集) 62 num7 = num1 ^ num2 63 print(num7) 64 num7 = num1 - num2 | num2 - num1 65 print(num7) 66 67 # 判断两个集合是否相同 68 print(num1 == num2) 69 print({1, 2, 3} == {1, 2, 3}) 70 71 # 一个集合是否包含另外一个集合(父集) 72 print({1, 2, 3} > {2, 3}) # True 73 print({1, 2, 3, 4} > {1, 2, 3, 4, 5}) # False 74 print({1, 2, 3} >= {1, 2, 3}) 75 76 # 一个集合是否是另一个集合的子集(子集) 77 print({1, 2, 3} <= {1, 2, 3}) 78 print({1, 2, 3} < {1, 2, 3}) 79 print({1, 2, 3} <= {1, 2}) 80 81 # 去重 82 # 集合去重有局限性 83 # 只能针对不可变类型 84 # 集合本身是无序的,去重之后无法保留原来的顺序 85 86 l = ['a', 'b', 1, 'a', 'a'] 87 # s = set(l) 88 # # 集合本身是无序的 89 # print(s) 90 # l = list(s) 91 # print(l) # 返回给列表时无法保证原来的顺序 92 93 # 通过代码实现列表去重后保证了原来的顺序 94 new_l = [] 95 for temp in l: 96 if temp not in new_l: 97 new_l.append(temp) 98 99 print(new_l) 100 101 # 不可以通过代码实现元组去重,因为本身元组内的元素值就是不可改变的 102 tup = (1, 2, 3, 1, 2, 4) 103 s = set(tup) 104 new_tup = list(s) 105 print(new_tup) 106 107 # 通过代码实现字符串内字符去重 108 str1 = 'hello world' 109 new_str1 = '' 110 111 for s in str1: 112 if s not in new_str1: 113 new_str1 += s 114 115 print(new_str1) 116 117 # 通过代码实现字典内重复数据去重 118 dict1 = [{'name': 'egon', 'age': 18, 'gender': 'male'}, 119 {'name': 'alex', 'age': 73, 'gender': 'fmale'}, 120 {'name': 'Bob', 'age': 57, 'gender': 'male'}, 121 {'name': 'egon', 'age': 18, 'gender': 'male'}, 122 {'name': 'egon', 'age': 18, 'gender': 'male'}] 123 124 # new_dict1 = set(dict1) # 列表中的每个元素是字典,是可变类型,是不可哈希的,所以会报错,只能通过代码形式去重 125 new_dict1 = [] 126 for d in dict1: 127 if d not in new_dict1: 128 new_dict1.append(d) 129 print( 130 new_dict1) # [{'name': 'egon', 'age': 18, 'gender': 'male'}, {'name': 'alex', 'age': 73, 'gender': 'fmale'}, 131 # {'name': 'Bob', 'age': 57, 'gender': 'male'}] 132 133 # 既去除了重复又保证了顺序 134 135 # 集合长度 136 print(len(new_dict1)) 137 138 # 关系运算,判断一个元素是否在该集合中 139 print({'name': 'egon', 'age': 18, 'gender': 'male'} in new_dict1) 140 print({'name': 'egon1', 'age': 18, 'gender': 'male'} in new_dict1) 141 142 # 集合的循环 143 for i in new_dict1: 144 print(i) 145 146 """ 147 一.关系运算 148 有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合 149 pythons={'jason','egon','kevin','ricky','gangdan','biubiu'} 150 linuxs={'kermit','tony','gangdan'} 151 1. 求出即报名python又报名linux课程的学员名字集合 152 2. 求出所有报名的学生名字集合 153 3. 求出只报名python课程的学员名字 154 4. 求出没有同时这两门课程的学员名字集合 155 """ 156 pythons = {'jason', 'egon', 'kevin', 'ricky', 'gangdan', 'biubiu'} 157 linuxs = {'kermit', 'tony', 'gangdan'} 158 # 求出即报名python又报名linux课程的学员名字集合 159 print(pythons & linuxs) 160 # 求出所有报名的学生名字集合 161 print(pythons | linuxs) 162 # 求出只报名python课程的学员名字 163 print(pythons - linuxs) 164 # 求出没有同时报这两门课程的学员名字集合 165 print(pythons ^ linuxs) 166 167 # 可变类型与不可变类型 168 # 可变类型:值发生改变时,内存地址没变,即id没变,证明了就是在改原值 169 # 不可变类型:值发生改变时,内存地址也变了,即id也变了,证明了不是在改原值,而是重新创建了一个值 170 171 # 数字类型是不可变类型 172 x = 10 173 print(id(x)) # 1470562435600 174 x = 20 175 print(id(x)) # 1470562435920 176 177 # 上述现象表明值发生改变了,x的值从10变成20,但是id也变了,也就是用的不是同一块内存空间,即产生了新的值,所以数字类型是不可变类型 178 179 str1 = 'hello' 180 print(id(str1)) # 2291141388272 181 str1 = 'world' 182 print(id(str1)) # 2291141388400 183 184 # st1的值从'hello'变成了'world',但是id也变了,也就是用的不是同一块内存空间,即产生了新值,所以字符串类型也是不可变类型 185 186 list1 = ['tom', 'jack', 'anne'] 187 print(id(list1)) # 3091933207936 188 list1 = ['tom1', 'jack1', 'anne1'] # 这相当于是重新创建了一个集合 189 print(id(list1)) # 3091933452736 190 191 # list1的值从['tom', 'jack', 'anne']变成了['tom1', 'jack1', 'anne1'],但是id也变了,也就是用的不是同一块内存空间,即产生了新值, 192 # 所以针对列表本身它其实是不可变类型 193 194 # 列表内元素'haha'变成了'niubi',但是list2的id没变,也就是用的还是用一块内存空间,即没有产生新值,也就是列表是可变类型 195 # 但是反过来再看列表内的字符串就是不可变类型 196 list2 = ['haha', 'xixi', 'hehe'] 197 print(id(list2)) 198 print(id(list2[0])) # 2596136168048 199 list2[0] = 'niubi' 200 print(id(list2)) 201 print(id(list2[0])) # 2596136168240 202 203 # 元组 204 t1 = ('tom', 'jack', [1, 2]) 205 # t1[0] = 'TOM' # 元组类型只能取不能改 206 # 元组内的元素无法修改,指的是元组内索引指向的内存地址不能被修改 207 print(t1) 208 # 1532888623280 209 # 1532888623344 210 # 1532888573568 211 print(id(t1[0])) 212 print(id(t1[1])) 213 print(id(t1[2])) 214 print(id(t1[2][0])) 215 t1[2][0] = 111 # 如果元组内的某个元素是可变类型,它的值是可以修改的,但是修改后还是不影响元组内索引指向的内存地址不变,变的只是元组内可变元素的内存地址。 216 # 1532888623280 217 # 1532888623344 218 # 1532888573568 219 print(id(t1[0])) 220 print(id(t1[1])) 221 print(id(t1[2])) 222 print(id(t1[2][0])) 223 224 # 字典类型 225 dict1 = {'name': 'egon', 226 'age': 10, 227 'gender': 'male'} 228 229 print(id(dict1)) # 2082429610688 230 dict1['name'] = 'lijipeng' 231 print(id(dict1)) # 2082429610688 232 233 # 字典内值改变后,字典本身的内存地址没变,也就是字典是可变类型
- test1
1 name = " aleegonxX" 2 # 1) 移除 name 变量对应的值两边的空格,并输出处理结果 3 print(name.strip(' ')) 4 # 2) 判断 name 变量对应的值是否以 "al" 开头,并输出结果 5 print(name.startswith('al')) 6 # 3) 判断 name 变量对应的值是否以 "X" 结尾,并输出结果 7 print(name.endswith('X')) 8 # 4) 将 name 变量对应的值中的 “l” 替换为 “p”,并输出结果 9 print(name.replace('l', 'p')) 10 # 5) 将 name 变量对应的值根据 “l” 分割,并输出结果。 11 print(name.split('l')) 12 # 6) 将 name 变量对应的值变大写,并输出结果 13 print(name.upper()) 14 # 7) 将 name 变量对应的值变小写,并输出结果 15 print(name.lower()) 16 # 8) 请输出 name 变量对应的值的第 2 个字符? 17 print(name[1]) 18 # 9) 请输出 name 变量对应的值的前 3 个字符? 19 print(name[0:3]) 20 # 10) 请输出 name 变量对应的值的后 2 个字符? 21 print(name[-2:]) 22 # 11) 请输出 name 变量对应的值中 “e” 所在索引位置? 23 print(name.index('e')) 24 print(name.find('e')) # 推荐使用find 25 # 12) 获取子序列,去掉最后一个字符。如: egonlin 则获取egonli 26 # print(name.split(name[-1])[0]) 27 print(name[:-1])
- test2
1 # 简单购物车,要求如下: 2 # 实现打印商品详细信息,用户输入商品名和购买个数,则将商品名,价格,购买个数加入购物列表,如果输入为空或其他非法输入则要求用户重新输入 3 4 msg_dic = { 5 'apple': 10, 6 'tesla': 10000, 7 'mac': 3000, 8 'lenovo': 30000, 9 'chicken': 10 10 } 11 12 goods_l = [] 13 14 while True: 15 # 打印商品列表 16 for key, item in msg_dic.items(): 17 print('name = {name},price = {price}'.format(name=key, price=item)) 18 choice = input('商品>>:').strip() 19 if not choice or choice not in msg_dic: continue 20 if choice == 'exit': break 21 count = input('商品个数>>:').strip() 22 if not count.isdigit(): continue 23 24 good_l = [choice, msg_dic[choice], count] 25 goods_l.append(good_l) 26 print(goods_l)
- test3
1 # 有如下值集合[11, 22, 33, 44, 55, 66, 77, 88, 99, 90...],将所有大于 2 # 66的值保存至字典的第一个key中,将小于66的值保存至第二个key的值中 3 # 4 # 即: {'k1': 大于66的所有值, 'k2': 小于66的所有值} 5 ''' 6 有如下值集合[11, 22, 33, 44, 55, 66, 77, 88, 99, 90...], 7 将所有大于66的值保存至字典的第一个key中,将小于66的值保存至第二个key的值中即: {'k1': 大于66的所有值, 'k2': 小于66的所有值} 8 ''' 9 10 list1 = [11, 22, 33, 44, 55, 66, 77, 88, 99, 90] 11 l1 = [] 12 l2 = [] 13 a = {'k1': l1, 'k2': l2} 14 for i in list1: 15 if i > 66: 16 l1.append(i) 17 elif i < 66: 18 l2.append(i) 19 20 print(a)
- test4
1 ''' 2 统计s="hello egon egon say hello xxx xxx"中每个单词的个数 3 # 结果如:{"hello":2,"egon":2,"say":1,"xxx":2} 4 ''' 5 6 # 我自己想出来的方式1: 7 s = 'hello egon egon say hello xxx xxx' 8 msg_keywords = {} 9 msg_l = s.split(' ') 10 11 for keyword in msg_l: 12 if keyword not in msg_keywords: 13 msg_keywords.setdefault(keyword, 1) 14 else: 15 msg_keywords.update({keyword: msg_keywords[keyword] + 1}) 16 17 print(msg_keywords) 18 19 # 方式2:使用列表中的count()方法来统计单词的个数 20 s = 'hello egon egon say hello xxx xxx' 21 words = s.split(' ') 22 dic = {} 23 for word in words: 24 dic[word] = words.count(word) 25 print(dic) 26 27 # 方式3:利用setdefault去掉重复值 28 s = 'hello egon egon say hello xxx xxx' 29 words = s.split(' ') 30 dic = {} 31 for word in words: 32 dic.setdefault(word,words.count(word)) 33 34 print(dic) 35 36 # 方式4:利用集合去重 37 s = 'hello egon egon say hello xxx xxx' 38 words = s.split(' ') 39 l = list(words) 40 dic = {} 41 42 for word in l: 43 dic[word] = words.count(word) 44 45 print(dic)
- test5
1 ''' 2 关系运算 3 有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合 4 pythons={'xiaohua','egon','mimi','gangdan','biubiu'} 5 linuxs={'mimi','xiaohei','gangdan'} 6 1. 求出即报名python又报名linux课程的学员名字集合 7 2. 求出所有报名的学生名字集合 8 3. 求出只报名python课程的学员名字 9 4. 求出没有同时这两门课程的学员名字集合 10 ''' 11 pythons={'xiaohua','egon','mimi','gangdan','biubiu'} 12 linuxs={'mimi','xiaohei','gangdan'} 13 14 print(pythons & linuxs) 15 print(pythons | linuxs) 16 print(pythons - linuxs) 17 print(pythons ^ linuxs)