Python基础(一)数据类型
Python能处理的数据类型分为2种,
可变的数据类型:列表、字典
不可变数据类型:数字、字符串、元祖
一、Python数据类型
1、Number(数字)
1.1 数字类型的创建
1 a=10 2 b=a 3 b=666 4 5 print(a)#10 6 print(b)#666
上面的画图理解的话就类似于下面的

1.2 Number 类型转换
1 var1=3.14 2 var2=5 3 var3=int(var1) 4 var4=float(var2) 5 6 print(var3,var4)
1 函数 返回值 ( 描述 ) 2 abs(x) 返回数字的绝对值,如abs(-10) 返回 10 3 ceil(x) 返回数字的上入整数,如math.ceil(4.1) 返回 5 4 cmp(x, y) 如果 x < y 返回 -1, 如果 x == y 返回 0, 如果 x > y 返回 1 5 exp(x) 返回e的x次幂(ex),如math.exp(1) 返回2.718281828459045 6 fabs(x) 返回数字的绝对值,如math.fabs(-10) 返回10.0 7 floor(x) 返回数字的下舍整数,如math.floor(4.9)返回 4 8 log(x) 如math.log(math.e)返回1.0,math.log(100,10)返回2.0 9 log10(x) 返回以10为基数的x的对数,如math.log10(100)返回 2.0 10 max(x1, x2,...) 返回给定参数的最大值,参数可以为序列。 11 min(x1, x2,...) 返回给定参数的最小值,参数可以为序列。 12 modf(x) 返回x的整数部分与小数部分,两部分的数值符号与x相同,整数部分以浮点型表示。 13 pow(x, y) x**y 运算后的值。 14 round(x [,n]) 返回浮点数x的四舍五入值,如给出n值,则代表舍入到小数点后的位数。 15 sqrt(x) 返回数字x的平方根,数字可以为负数,返回类型为实数,如math.sqrt(4)返回 2+0j
2、字符串类型(string)
字符串是以单引号'或双引号"括起来的任意文本,比如'abc',"123"等等。
请注意,''或""本身只是一种表示方式,不是字符串的一部分,因此,字符串'abc'只有a,b,c这3个字符。如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK"包含的字符是I,',m,空格,O,K这6个字符。
2.1 创建字符串
1 var1 = 'Hello World!' 2 var2 = "Python RAlvin"
对应操作:
1 # 1 * 重复输出字符串 2 print('hello'*2) 3 4 # 2 [] ,[:] 通过索引获取字符串中字符,这里和列表的切片操作是相同的,具体内容见列表 5 print('helloworld'[2:]) 6 7 # 3 in 成员运算符 - 如果字符串中包含给定的字符返回 True 8 print('el' in 'hello') 9 10 # 4 % 格式字符串 11 print('alex is a good teacher') 12 print('%s is a good teacher'%'alex') 13 14 15 # 5 + 字符串拼接 16 a='123' 17 b='abc' 18 c='789' 19 d1=a+b+c 20 print(d1) 21 # +效率低,该用join 22 d2=''.join([a,b,c]) 23 print(d2)
python的str类型的内置方法:
1 # string.capitalize() 把字符串的第一个字符大写 2 # string.center(width) 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串 3 # string.count(str, beg=0, end=len(string)) 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数 4 # string.decode(encoding='UTF-8', errors='strict') 以 encoding 指定的编码格式解码 string,如果出错默认报一个 ValueError 的 异 常 , 除 非 errors 指 定 的 是 'ignore' 或 者'replace' 5 # string.encode(encoding='UTF-8', errors='strict') 以 encoding 指定的编码格式编码 string,如果出错默认报一个ValueError 的异常,除非 errors 指定的是'ignore'或者'replace' 6 # string.endswith(obj, beg=0, end=len(string)) 检查字符串是否以 obj 结束,如果beg 或者 end 指定则检查指定的范围内是否以 obj 结束,如果是,返回 True,否则返回 False. 7 # string.expandtabs(tabsize=8) 把字符串 string 中的 tab 符号转为空格,tab 符号默认的空格数是 8。 8 # string.find(str, beg=0, end=len(string)) 检测 str 是否包含在 string 中,如果 beg 和 end 指定范围,则检查是否包含在指定范围内,如果是返回开始的索引值,否则返回-1 9 # string.index(str, beg=0, end=len(string)) 跟find()方法一样,只不过如果str不在 string中会报一个异常. 10 # string.isalnum() 如果 string 至少有一个字符并且所有字符都是字母或数字则返回 True,否则返回 False 11 # string.isalpha() 如果 string 至少有一个字符并且所有字符都是字母则返回 True,否则返回 False 12 # string.isdecimal() 如果 string 只包含十进制数字则返回 True 否则返回 False. 13 # string.isdigit() 如果 string 只包含数字则返回 True 否则返回 False. 14 # string.islower() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是小写,则返回 True,否则返回 False 15 # string.isnumeric() 如果 string 中只包含数字字符,则返回 True,否则返回 False 16 # string.isspace() 如果 string 中只包含空格,则返回 True,否则返回 False. 17 # string.istitle() 如果 string 是标题化的(见 title())则返回 True,否则返回 False 18 # string.isupper() 如果 string 中包含至少一个区分大小写的字符,并且所有这些(区分大小写的)字符都是大写,则返回 True,否则返回 False 19 # string.join(seq) 以 string 作为分隔符,将 seq 中所有的元素(的字符串表示)合并为一个新的字符串 20 # string.ljust(width) 返回一个原字符串左对齐,并使用空格填充至长度 width 的新字符串 21 # string.lower() 转换 string 中所有大写字符为小写. 22 # string.lstrip() 截掉 string 左边的空格 23 # string.maketrans(intab, outtab]) maketrans() 方法用于创建字符映射的转换表,对于接受两个参数的最简单的调用方式,第一个参数是字符串,表示需要转换的字符,第二个参数也是字符串表示转换的目标。 24 # max(str) 返回字符串 str 中最大的字母。 25 # min(str) 返回字符串 str 中最小的字母。 26 # string.partition(str) 有点像 find()和 split()的结合体,从 str 出现的第一个位置起,把 字 符 串 string 分 成 一 个 3 元 素 的 元 组 (string_pre_str,str,string_post_str),如果 string 中不包含str 则 string_pre_str == string. 27 # string.replace(str1, str2, num=string.count(str1)) 把 string 中的 str1 替换成 str2,如果 num 指定,则替换不超过 num 次. 28 # string.rfind(str, beg=0,end=len(string) ) 类似于 find()函数,不过是从右边开始查找. 29 # string.rindex( str, beg=0,end=len(string)) 类似于 index(),不过是从右边开始. 30 # string.rjust(width) 返回一个原字符串右对齐,并使用空格填充至长度 width 的新字符串 31 # string.rpartition(str) 类似于 partition()函数,不过是从右边开始查找. 32 # string.rstrip() 删除 string 字符串末尾的空格. 33 # string.split(str="", num=string.count(str)) 以 str 为分隔符切片 string,如果 num有指定值,则仅分隔 num 个子字符串 34 # string.splitlines(num=string.count('\n')) 按照行分隔,返回一个包含各行作为元素的列表,如果 num 指定则仅切片 num 个行. 35 # string.startswith(obj, beg=0,end=len(string)) 检查字符串是否是以 obj 开头,是则返回 True,否则返回 False。如果beg 和 end 指定值,则在指定范围内检查. 36 # string.strip([obj]) 在 string 上执行 lstrip()和 rstrip() 37 # string.swapcase() 翻转 string 中的大小写 38 # string.title() 返回"标题化"的 string,就是说所有单词都是以大写开始,其余字母均为小写(见 istitle()) 39 # string.translate(str, del="") 根据 str 给出的表(包含 256 个字符)转换 string 的字符,要过滤掉的字符放到 del 参数中 40 # string.upper() 转换 string 中的小写字母为大写
2.2 字符串的格式化
Python的字符串格式化有两种方式:%格式符方式,format方式
2.2.1 %格式符
%[(name)][flags][width].[precision]typecode
1 (name) 可选,用于选择指定的key 2 flags 可选,可供选择的值有: 3 + 右对齐;正数前加正好,负数前加负号; 4 - 左对齐;正数前无符号,负数前加负号; 5 空格 右对齐;正数前加空格,负数前加负号; 6 0 右对齐;正数前无符号,负数前加负号;用0填充空白处 7 width 可选,占有宽度 8 .precision 可选,小数点后保留的位数 9 typecode 必选 10 s,获取传入对象的__str__方法的返回值,并将其格式化到指定位置 11 r,获取传入对象的__repr__方法的返回值,并将其格式化到指定位置 12 c,整数:将数字转换成其unicode对应的值,10进制范围为 0 <= i <= 1114111(py27则只支持0-255);字符:将字符添加到指定位置 13 o,将整数转换成 八 进制表示,并将其格式化到指定位置 14 x,将整数转换成十六进制表示,并将其格式化到指定位置 15 d,将整数、浮点数转换成 十 进制表示,并将其格式化到指定位置 16 e,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(小写e) 17 E,将整数、浮点数转换成科学计数法,并将其格式化到指定位置(大写E) 18 f, 将整数、浮点数转换成浮点数表示,并将其格式化到指定位置(默认保留小数点后6位) 19 F,同上 20 g,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是e;) 21 G,自动调整将整数、浮点数转换成 浮点型或科学计数法表示(超过6位数用科学计数法),并将其格式化到指定位置(如果是科学计数则是E;) 22 %,当字符串中存在格式化标志时,需要用 %%表示一个百分号 23 24 注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式
1 name占10位,+,右对齐,age占10位,-,左对齐 2 b = "%(name)+10s————————%(age)-10d————————"%{'name':'xx','age':20}
2.2.2 format方式
格式:
1 [[fill]align][sign][#][0][width][,][.precision][type] 2 3 fill 【可选】空白处填充的字符 4 align 【可选】对齐方式(需配合width使用) 5 <,内容左对齐 6 >,内容右对齐(默认) 7 =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字 8 ^,内容居中 9 sign 【可选】有无符号数字 10 +,正号加正,负号加负; 11 -,正号不变,负号加负; 12 空格 ,正号空格,负号加负; 13 # 【可选】对于二进制、八进制、十六进制,如果加上#,会显示 0b/0o/0x,否则不显示 14 , 【可选】为数字添加分隔符,如:1,000,000 15 width 【可选】格式化位所占宽度 16 .precision 【可选】小数位保留精度 17 type 【可选】格式化类型 18 传入” 字符串类型 “的参数 19 s,格式化字符串类型数据 20 空白,未指定类型,则默认是None,同s 21 传入“ 整数类型 ”的参数 22 b,将10进制整数自动转换成2进制表示然后格式化 23 c,将10进制整数自动转换为其对应的unicode字符 24 d,十进制整数 25 o,将10进制整数自动转换成8进制表示然后格式化; 26 x,将10进制整数自动转换成16进制表示然后格式化(小写x) 27 X,将10进制整数自动转换成16进制表示然后格式化(大写X) 28 传入“ 浮点型或小数类型 ”的参数 29 e, 转换为科学计数法(小写e)表示,然后格式化; 30 E, 转换为科学计数法(大写E)表示,然后格式化; 31 f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化; 32 F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化; 33 g, 自动在e和f中切换 34 G, 自动在E和F中切换 35 %,显示百分比(默认显示小数点后6位) 36 37 38 39 fill 【可选】空白处填充的字符 40 41 align 【可选】对齐方式(需配合width使用) 42 43 <,内容左对齐 44 >,内容右对齐(默认) 45 =,内容右对齐,将符号放置在填充字符的左侧,且只对数字类型有效。 即使:符号+填充物+数字 46 ^,内容居中
1 tp1 = "i am {}, age {}, {}".format("seven", 18, 'alex') 2 tp2 = "i am {}, age {}, {}".format(*["seven", 18, 'alex']) 3 tp3 = "i am {0}, age {1}, really {0}".format("seven", 18) 4 tp4 = "i am {0}, age {1}, really {0}".format(*["seven", 18]) 5 tp5 = "i am {name}, age {age}, really {name}".format(name="seven", age=18) 6 tp6 = "i am {name}, age {age}, really {name}".format(**{"name": "seven", "age": 18}) 7 tp7 = "i am {0[0]}, age {0[1]}, really {0[2]}".format([1, 2, 3], [11, 22, 33]) 8 tp8 = "i am {:s}, age {:d}, money {:f}".format("seven", 18, 88888.1) 9 tp9 = "i am {:s}, age {:d}".format(*["seven", 18]) 10 tp10 = "i am {name:s}, age {age:d}".format(name="seven", age=18) 11 tp11 = "i am {name:s}, age {age:d}".format(**{"name": "seven", "age": 18}) 12 print(tp1) 13 print(tp2) 14 print(tp3) 15 print(tp4) 16 print(tp5) 17 print(tp6) 18 print(tp7) 19 print(tp8) 20 print(tp9) 21 print(tp10) 22 print(tp11)
3、字节类型(bytes)
Python 3最重要的新特性大概要算是对文本和二进制数据作了更为清晰的区分。文本总是Unicode,由str类型表示,二进制数据则由bytes类型表示。Python 3不会以任意隐式的方式混用str和bytes,正是这使得两者的区分特别清晰。你不能拼接字符串和字节包,也无法在字节包里搜索字符串(反之亦然),也不能将字符串传入参数为字节包的函数(反之亦然)。这是件好事。
不管怎样,字符串和字节包之间的界线是必然的,下面的图解非常重要,务请牢记于心:

字符串可以编码成字节包,而字节包可以解码成字符串。
1 >>>'€20'.encode('utf-8') 2 b'\xe2\x82\xac20' 3 >>> b'\xe2\x82\xac20'.decode('utf-8') 4 '€20'
这个问题要这么来看:字符串是文本的抽象表示。字符串由字符组成,字符则是与任何特定二进制表示无关的抽象实体。在操作字符串时,我们生活在幸福的无知之中。我们可以对字符串进行分割和分片,可以拼接和搜索字符串。我们并不关心它们内部是怎么表示的,字符串里的每个字符要用几个字节保存。只有在将字符串编码成字节包(例如,为了在信道上发送它们)或从字节包解码字符串(反向操作)时,我们才会开始关注这点。
传入encode和decode的参数是编码(或codec)。编码是一种用二进制数据表示抽象字符的方式。目前有很多种编码。上面给出的UTF-8是其中一种,下面是另一种:
1 >>>'€20'.encode('iso-8859-15') 2 b'\xa420' 3 >>> b'\xa420'.decode('iso-8859-15') 4 '€20'
编码是这个转换过程中至关重要的一部分。离了编码,bytes对象b'\xa420'只是一堆比特位而已。编码赋予其含义。采用不同的编码,这堆比特位的含义就会大不同:
1 >>> b'\xa420'.decode('windows-1255') 2 '₪20'
1 a = bytes('中国','utf8') 2 b = bytes('中国','gbk') 3 print(a,b) 4 5 c = a.decode('utf8') 6 d = b.decode('gbk') 7 print(c,d)
注意:对于 ASCII 字符串,因为无论哪种编码对应的结果都是一样的,所以可以直接使用 b'xxxx' 赋值创建 bytes 实例,但对于非 ASCII 编码的字符则不能通过这种方式创建 bytes 实例,需要指明编码方式。
1 b1=b'123' 2 print(type(b1)) 3 # b2=b'中国' #报错 4 # 所以得这样: 5 b2=bytes('中国','utf8') 6 print(b2)#b'\xe4\xb8\xad\xe5\x9b\xbd'
关于编码后续会有一个专题来讲解。
4、布尔值
一个布尔值只有True、False两种值,要么是True,要么是False,在Python中,可以直接用True、False表示布尔值(请注意大小写)
1 print(True) 2 print(4>2) 3 print(bool([3,4])) 4 print(True+1)
与或非操作:
1 bool(1 and 0) 2 bool(1 and 1) 3 bool(1 or 0) 4 bool(not 0)
布尔值经常用在条件判断中:
1 age=18 2 if age>18:#bool(age>18) 3 print('old') 4 else: 5 print('young')
5、List(列表)
列表(list)是Python以及其他语言中最常用到的数据结构之一。Python使用使用中括号 [ ] 来解析列表。列表是可变的(mutable)——可以改变列表的内容。
5.1 查
1 a = [1,2,3,4] 2 3 # 查 4 print(a[2]) # 获取列表中的某个元素,index从0开始 5 print(a[0:2]) #顾头不顾尾 6 print(a[-1]) # 列表中最后一个元素 7 print(a[0:3:2]) # 最后一个2是步长,也就是间隔一个取一个元素 8 print(a[3:0:-1]) # 步长是-1,0表示列表的第一元素,但是上面说了顾头不顾尾,如果想取到第一个元素,可以不写,例如下面 9 print(a[-1::-1]) # 实现了倒序的功能 10 print(a[:]) # 表示获取整个列表
5.2 增
1 name_list = ['wanstack','fish','张三','李四'] 2 3 # 增 (append,insert) 4 # insert 方法用于将对象插入到列表中,而append方法则用于在列表末尾追加新的对象 5 name_list.append('王五') 6 print(name_list) 7 name_list.insert(2,'python') 8 print(name_list)
5.3 改
1 # 改(重新赋值) 2 name_list[3] = 'openstack' 3 print(name_list) 4 name_list[0:3] = ['Linux','DevOps','Python'] 5 print(name_list)
5.4 删
1 # 删 (remove,del,pop) 2 # 删除一个元素 3 name_list.remove('wanstack') 4 print(name_list) 5 6 del name_list[0] 7 print(name_list) 8 9 print(name_list.pop()) #删除列表中最后一个元素,并且返回值为这个元素 10 print(name_list)
5.5 其他操作
count 方法统计某个元素在列表中出现的次数
1 >>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to') 2 2 3 >>> x = [[1,2], 1, 1, [2, 1, [1, 2]]] 4 >>> x.count(1) 5 2 6 >>> x.count([1,2]) 7 1
extend 方法可以在列表的末尾一次性追加另一个序列中的多个值
1 >>> a = [1, 2, 3] 2 >>> b = [4, 5, 6] 3 >>> a.extend(b) 4 >>> a 5 [1, 2, 3, 4, 5, 6]
extend 方法修改了被扩展的列表,而原始的连接操作(+)则不然,它会返回一个全新的列表。
1 >>> a = [1, 2, 3] 2 >>> b = [4, 5, 6] 3 >>> a.extend(b) 4 >>> a 5 [1, 2, 3, 4, 5, 6] 6 >>> 7 >>> a + b 8 [1, 2, 3, 4, 5, 6, 4, 5, 6] 9 >>> a 10 [1, 2, 3, 4, 5, 6]
index 方法用于从列表中找出某个值第一个匹配项的索引位置:
1 names_class2.index('李四')
reverse 方法将列表中的元素反向存放。
1 names_class2.reverse() 2 print(names_class2)
sort 方法用于在原位置对列表进行排序
1 x = [4, 6, 2, 1, 7, 9] 2 x.sort()#x.sort(reverse=True)
6、tuple (元组)
元组被称为只读列表,即数据可以被查询,但不能被修改,所以,列表的切片操作同样适用于元组。
元组写在小括号(())里,元素之间用逗号隔开。
虽然tuple的元素不可改变,但它可以包含可变的对象,比如list列表。
构造包含 0 个或 1 个元素的元组比较特殊,所以有一些额外的语法规则:
1 tup1 = () # 空元组 2 tup2 = (20,) # 一个元素,需要在元素后添加逗号
作用:
1 对于一些数据我们不想被修改,可以使用元组;
2 另外,元组的意义还在于,元组可以在映射(和集合的成员)中当作键使用——而列表则不行;元组作为很多内建函数和方法的返回值存在。
7、dict (字典)
字典是python中唯一的映射类型,采用键值对(key-value)的形式存储数据。python对key进行哈希函数运算,根据计算的结果决定value的存储地址,所以字典是无序存储的,且key必须是可哈希的。可哈希表示key必须是不可变类型,如:数字、字符串、元组。
字典(dictionary)是除列表以外python之中最灵活的内置数据结构类型。列表是有序的对象结合,字典是无序的对象集合。两者之间的区别在于:字典当中的元素是通过键来存取的,而不是通过偏移存取。
7.1 创建字典
1 dic1={'name':'alex','age':36,'sex':'male'} 2 dic2=dict((('name','alex'),)) 3 print(dic1) 4 print(dic2)
7.2 增
1 dic = {} 2 dic['name'] = 'wanstack' 3 dic['age'] = 29 4 print(dic) 5 print(dic.setdefault('name','fish')) # 如果存在key,则返回对应key的value 6 print(dic.setdefault('hobby','jiayun')) # 如果不存在key,则把这个key和value添加到字典中,并且返回这个value 7 print(dic)
7.3 查
1 dic2 = {'name': 'wanstack', 'age': 29, 'hobby': 'jiayun'} 2 print(dic2['name']) 3 # print(dic2['names']) 4 print(dic2.get('name','fish')) #如果存在key,则返回对应key的value 5 print(dic2.get('sex','male')) # 如果不存在key,则不想字典中添加这个key,返回这个对应key的value 6 print(dic2) 7 """ 8 wanstack 9 wanstack 10 male 11 {'name': 'wanstack', 'age': 29, 'hobby': 'jiayun'} 12 """ 13 14 15 print(dic2.items()) 16 print(dic2.keys()) 17 print(dic2.values()) 18 """ 19 dict_items([('name', 'wanstack'), ('age', 29), ('hobby', 'jiayun')]) 20 dict_keys(['name', 'age', 'hobby']) 21 dict_values(['wanstack', 29, 'jiayun']) 22 """ 23 # 判断字典中是否存在key 24 print('wanstack' in dic2) # py2: dic3.has_key('name') 25 print('name' in dic2) 26 """ 27 False 28 True 29 """ 30 31 print(list(dic2.items())) 32 print(tuple(dic2.keys())) 33 print(list(dic2.values())) 34 """ 35 [('name', 'wanstack'), ('age', 29), ('hobby', 'jiayun')] 36 ('name', 'age', 'hobby') 37 ['wanstack', 29, 'jiayun'] 38 """
7.4 改
1 dic3 = {'name': 'wanstack', 'age': 29, 'hobby': 'jiayun'} 2 3 dic3['name'] = 'fish' 4 print(dic3) 5 # {'name': 'fish', 'age': 29, 'hobby': 'jiayun'} 6 7 dic4 = {1:1,2:2,3:3} 8 dic3.update(dic4) 9 print(dic3) 10 # {'name': 'fish', 'age': 29, 'hobby': 'jiayun', 1: 1, 2: 2, 3: 3}
7.5 删
1 dic4 = {'name': 'wanstack', 'age': 29, 'hobby': 'jiayun'} 2 dic4.clear() # 清空字典 3 print(dic4) 4 # {} 5 dic4 = {'name': 'wanstack', 'age': 29, 'hobby': 'jiayun'} 6 del dic4['name'] # 删除字典中指定的key和value 7 print(dic4) 8 # {'age': 29, 'hobby': 'jiayun'} 9 a=dic4.popitem() # 删除字典中最后一个key和value,并且返回被删除的对应的key和value 10 print(a,dic4) 11 # ('hobby', 'jiayun') {'age': 29} 12 dic4 = {'name': 'wanstack', 'age': 29, 'hobby': 'jiayun'} 13 a = dic4.pop('age') # 删除指定key和value,并返回value 14 print(a,dic4) 15 # 29 {'name': 'wanstack', 'hobby': 'jiayun'} 16 del dic4 # 删除整个字典 17 print(dic4)
7.6 其他操作以及涉及到的方法
1 d1 = dict.fromkeys(['host1','host2','host3'],'mac') 2 print(d1) 3 # {'host1': 'mac', 'host2': 'mac', 'host3': 'mac'} 4 d1['host1']='xiaomi' 5 print(d1) 6 # {'host1': 'xiaomi', 'host2': 'mac', 'host3': 'mac'} 7 d2=dict.fromkeys(['host1','host2','host3'],['Mac','huawei']) 8 print(d2) 9 # {'host1': ['Mac', 'huawei'], 'host2': ['Mac', 'huawei'], 'host3': ['Mac', 'huawei']} 10 d2['host1'][0]='xiaomi' 11 print(d2) 12 # {'host1': ['xiaomi', 'huawei'], 'host2': ['xiaomi', 'huawei'], 'host3': ['xiaomi', 'huawei']} 13 # 从上面的结果可以看到fromkeys是浅拷贝,关于深浅拷贝会有专门的说明
字典的嵌套
1 av_catalog = { 2 "欧美":{ 3 "www.youporn.com": ["很多免费的,世界最大的","质量一般"], 4 "www.pornhub.com": ["很多免费的,也很大","质量比yourporn高点"], 5 "letmedothistoyou.com": ["多是自拍,高质量图片很多","资源不多,更新慢"], 6 "x-art.com":["质量很高,真的很高","全部收费,屌比请绕过"] 7 }, 8 "日韩":{ 9 "tokyo-hot":["质量怎样不清楚,个人已经不喜欢日韩范了","听说是收费的"] 10 }, 11 "大陆":{ 12 "1024":["全部免费,真好,好人一生平安","服务器在国外,慢"] 13 } 14 } 15 16 av_catalog["大陆"]["1024"][1] += ",可以用爬虫爬下来" 17 print(av_catalog["大陆"]["1024"]) 18 #ouput 19 ['全部免费,真好,好人一生平安', '服务器在国外,慢,可以用爬虫爬下来']
字典的排序
1 # sorted(dict) : 返回一个有序的包含字典所有key的列表 2 dic={5:'555',2:'222',4:'444'} 3 print(sorted(dic)) 4 5 # 上面是按照key排序,下面是按照value排序 6 print(sorted(dic.values())
字典的遍历
1 dic2 = {'name': 'wanstack', 'age': 29, 'hobby': 'jiayun'} 2 # 推荐使用这种方法来遍历字典 3 for i in dic2: 4 print(i,dic2[i]) 5 # 其余2中方法遍历 6 for i in dic2.items(): 7 print(i) 8 for i,k in dic2.items(): 9 print(i,k)
8、set(集合)
集合是一个无序的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集等关系
集合(set):把不同的元素组成一起形成集合,是python基本的数据类型。
集合元素(set elements):组成集合的成员(不可重复)
1 li=[1,2,'a','b'] 2 s =set(li) 3 print(s) # {1, 2, 'a', 'b'} 4 5 li2=[1,2,1,'a','a'] 6 s=set(li2) 7 print(s) #{1, 2, 'a'}
集合对象是一组无序排列的可哈希的值:集合成员可以做字典的键
1 li=[[1,2],'a','b'] 2 s =set(li) #TypeError: unhashable type: 'list' 3 print(s)
集合分类:可变集合、不可变集合
可变集合(set):可添加和删除元素,非可哈希的,不能用作字典的键,也不能做其他集合的元素
不可变集合(frozenset):与上面恰恰相反
1 li=[1,'a','b'] 2 s =set(li) 3 dic={s:'123'} #TypeError: unhashable type: 'set'
集合的相关操作
8.1、创建集合
由于集合没有自己的语法格式,只能通过集合的工厂方法set()和frozenset()创建
1 s1 = set('alvin') 2 3 s2= frozenset('yuan') 4 5 print(s1,type(s1)) #{'l', 'v', 'i', 'a', 'n'} <class 'set'> 6 print(s2,type(s2)) #frozenset({'n', 'y', 'a', 'u'}) <class 'frozenset'>
8.2、访问集合
由于集合本身是无序的,所以不能为集合创建索引或切片操作,只能循环遍历或使用in、not in来访问或判断集合元素。
1 s1 = set('alvin') 2 print('a' in s1) 3 print('b' in s1) 4 #s1[1] #TypeError: 'set' object does not support indexing 5 6 for i in s1: 7 print(i) 8 # 9 # True 10 # False 11 # v 12 # n 13 # l 14 # i 15 # a
可使用以下内建方法来更新:
s.add()
s.update()
s.remove()
注意只有可变集合才能更新:
1 s2 = set('wanstack') 2 s2.add(0) 3 s2.add('mmm') 4 print(s2) 5 # {0, 'mmm', 't', 'n', 'w', 'a', 's', 'c', 'k'} 6 s2.update('pppsfgsdfs') 7 print(s2) 8 # {0, 'k', 'n', 'd', 't', 'f', 's', 'g', 'a', 'c', 'w', 'mmm', 'p'} 9 s2.remove('p') 10 print(s2) 11 # {0, 'f', 'n', 's', 'd', 'g', 'c', 'w', 'k', 'a', 'mmm', 't'}
del:删除集合本身
8.3、集合类型操作符
1 in ,not in
2 集合等价与不等价(==, !=)
3 子集、超集
1 s=set('alvinyuan') 2 s1=set('alvin') 3 print('v' in s) 4 print(s1<s) 5 """ 6 True 7 True 8 """
4 联合(|)
联合(union)操作与集合的or操作其实等价的,联合符号有个等价的方法,union()。
1 s1=set('alvin') 2 s2=set('yuan') 3 s3=s1|s2 4 print(s3) #{'a', 'l', 'i', 'n', 'y', 'v', 'u'} 5 print(s1.union(s2)) #{'a', 'l', 'i', 'n', 'y', 'v', 'u'}
5、交集(&)
与集合and等价,交集符号的等价方法是intersection()
1 s1=set('alvin') 2 s2=set('yuan') 3 s3=s1&s2 4 print(s3) #{'n', 'a'} 5 6 print(s1.intersection(s2)) #{'n', 'a'}
6、差集(-)
等价方法是difference()
1 s1=set('alvin') 2 s2=set('yuan') 3 s3=s1-s2 4 print(s3) #{'v', 'i', 'l'} 5 6 print(s1.difference(s2)) #{'v', 'i', 'l'}
7、对称差集(^)
对称差分是集合的XOR(‘异或’),取得的元素属于s1,s2但不同时属于s1和s2.其等价方法symmetric_difference(),交集的取反操作
1 s1=set('alvin') 2 s2=set('yuan') 3 s3=s1^s2 4 print(s3) #{'l', 'v', 'y', 'u', 'i'} 5 6 print(s1.symmetric_difference(s2)) #{'l', 'v', 'y', 'u', 'i'}
8、去重应用
1 '''最简单的去重方式''' 2 lis = [1,2,3,4,1,2,3,4] 3 print list(set(lis)) #[1, 2, 3, 4]
浙公网安备 33010602011771号