Python之路,第九篇:Python入门与基础9
python3 集合set
集合set概念
集合是可变的容器;满足数学意义上的定义,求并集交集等
集合内的数据对象都是唯一的(不能重复多次)
集合是无序的存储结构,集合中的数据没有先后关系
集合是相当于只有键,没有值的字典,则键是集合的数据、
集合内的元素必须是不可变对象
集合是可迭代的(可以用for等遍历)
生成空集合:
set()
生成非空集合:
set(iterable) 函数
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> set([3,5,7,9]) 2 {9, 3, 5, 7} 3 >>> set("xiaoming") 4 {'o', 'a', 'x', 'i', 'n', 'm', 'g'} 5 >>> set("ABCCBA") 6 {'B', 'C', 'A'} 7 >>> s = set({"name":"xiaoming","age":12}) 8 >>> s 9 {'age', 'name'} 10 >>> type(s) 11 <class 'set'> 12 >>> s1 = ( ("ABC", 123, True) ) 13 >>> s1 14 ('ABC', 123, True) 15 >>> s2 = {True, None, "ABC", (1,2,3), 3.14} 16 >>> s2 17 {True, 'ABC', 3.14, None, (1, 2, 3)} 18 >>> type(s2) 19 <class 'set'> 20 >>>
集合的运算:
交集, 并集, 补集, 子集, 超集
A = { 1,2,3 } B = { 2,3,4 }
交集 = { 2 ,3 }
并集 = { 1,2,3,4 }
补集 A - B = {1}
B - A = {4}
集合的运算:
- 生成两个集合的补集
A = { 1,2,3 } B = { 2,3,4 }
A - B = {1}
B - A = {4}
| 生成两个集合的并集
A = { 1,2,3 } B = { 2,3,4 }
A | B #{1,2,3,4}
& 生成两个集合的交集
A = { 1,2,3 } B = { 2,3,4 }
A & B #{2,3}
{1,2} & {5,6} #set() 空集
^ 生成两个集合的补集
A = { 1,2,3 } B = { 2,3,4 }
A ^ B # {1, 4}
A ^ B --> (A -B ) | (B -A)
> 判断一个集合是另一个集合的超集
< 判断一个集合是另一个集合的真子集
A = {1,2,3} C= {2,3}
A > C #True
C < A #True
== / != 判断集合相同、不同
A = {1,2,3} C= {2,3} D= {2,1,3}
A==D # True
A==C #False
>= <= 判断超集和相同、子集和相同
例:略
in 、not in 运算符
等同于字典的in 、not in
python3 集合中常用的方法:
S代表集合对象
S.add(e) 在集合添加一个新元素, 如果元素已经存在,则不添加,
S.clear() 清空集合内所有的元素
S.copy() 复制集合(浅拷贝)
S.difference(s2) 等同于S-s2
S.difference_update(s2) 等同于S = S-s2
S.discard(digit) 从集合S中移除一个数字,如果digit不是数字,则什么都不做。
S.intersection(s2) 等同于S & s2
S.intersection_update(s2) 等同于S = S & s2
S.issubset(s2) 如果S为s2的子集返回True,否则返回False, 等同于S < s2
S.pop() 从集合S中删除一个随机元素
S.remove(e) 从集合找那个删除一个元素,如果元素不存在则会产生一个keyerror错误
S.union(s2) 生成S与s2的全集等同于 S | s2
S.update(s2) 等同于 S = S | s2
集合是可迭代对象;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> s = {"abc",123, (1910,1,1)} 2 >>> for x in s: 3 print(x) 4 5 6 123 7 abc 8 (1910, 1, 1) 9 >>>
字典也是可迭代对象;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> d = {'name':'xiaoming',(2011,1,1):'生日'} 2 >>> for x in d: 3 print(x) 4 5 6 (2011, 1, 1) 7 name 8 >>>
用于集合的函数
len(x) 返回长度
max(x) 返回最大值
min(x) 返回最小值
sum(x) 返回和
any(x) 真值测试,任意为真,则返回True,否则为False
all(x) 真值测试,所有为真,则返回True,否则为False
集合推导式:
语法: {表达式 if 变量 in 可迭代对象 (if 条件表达式)}
集合推导式可以嵌套;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> names = ['a','b','c','d','e'] 2 >>> a_set = { n for n in names} 3 >>> print(a_set) 4 {'a', 'd', 'b', 'c', 'e'} 5 >>> names = ['a','b','c','d','e','a','b','c','d','e'] 6 >>> a_set = {n for n in names} 7 >>> print(a_set) 8 {'a', 'd', 'b', 'c', 'e'} 9 >>> {x for x in range(10)} 10 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9} 11 >>> {x:x for x in range(1,10)} 12 {1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9} 13 >>>
总结:
python3中 三种可变的数据类型: list 、 dict、 set
固定集合 frozenset
概念:创建一个不可变的,无序的,含有唯一元素的集合;
创建一个空的固定集合
frozenset()
创建一个非空的固定集合
frozenset(iterable)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 >>> frozenset() 2 frozenset() 3 >>> frozenset([1,2,3,4,5]) 4 frozenset({1, 2, 3, 4, 5}) 5 >>>
固定集合的运算(等同于set运算)
& 交集 、 | 并集 、 - 补集 、 ^ 对称补集 、
in 、not in 运算
< <= > >= == !=
固定集合的方法:(不存在添加更新)
相当于集合的全部方法去掉修改集合的方法;
作用:固定集合可以作为字典的键,可以作为集合的值;
总结:
数据类型分可变和不可变的;
bool int float complex str list dict tuple set frozenset
值: None 、 True 、 False ....
运算符:
+ - * / ** // % (7个)
< <= > >= == !=
is 、 is not
in 、 not in
not and or
+= -= *= /=......
~ & ^ | << >>>
+ (正号) -(负值)
= (赋值)绑定
表达式:
“1 + 2”
input(“aaa”)
语句:
a=10
if 语句 、 else 语句
while 语句、 break 语句 、 for 语句
continue语句 、 pass语句、 del 语句
练习1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!/usr/bin/python 2 3 for x in range(1, 21): 4 print(x, end=' ') 5 if x % 5 == 0: 6 print() 7 8 >>> ================================ RESTART ================================ 9 >>> 10 1 2 3 4 5 11 6 7 8 9 10 12 11 12 13 14 15 13 16 17 18 19 20 14 >>>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #!/usr/bin/python 2 3 for x in range(1, 21): 4 print(x, end=' ') 5 print() 6 7 >>> ================================ RESTART ================================ 8 >>> 9 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 10 >>>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 h = int(input("请打印树干高度:")) 2 #打印树冠 3 for x in range(h): 4 print( ' ' * ( h - x - 1 ) + '*' * ( 2 * x + 1 ) ) 5 #打印树干 6 for x in range(h): 7 print( ' ' * ( h - 1 ) + '*' ) 8 9 请打印树干高度:4 10 * 11 *** 12 ***** 13 ******* 14 * 15 * 16 * 17 *
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 begin = int(input("请输入开始值:")) 2 end = int(input("请输入结束值:")) 3 print("十进制编码 十六进制编码 文字") 4 for x in range(begin, (end+1)): 5 print(str(x).center(11), hex(x).center(14), chr(x)) 6 请输入开始值:10000 7 请输入结束值:10020 8 十进制编码 十六进制编码 文字 9 10000 0x2710 ✐ 10 10001 0x2711 ✑ 11 10002 0x2712 ✒ 12 10003 0x2713 ✓ 13 10004 0x2714 ✔ 14 10005 0x2715 ✕ 15 10006 0x2716 ✖ 16 10007 0x2717 ✗ 17 10008 0x2718 ✘ 18 10009 0x2719 ✙ 19 10010 0x271a ✚ 20 10011 0x271b ✛ 21 10012 0x271c ✜ 22 10013 0x271d ✝ 23 10014 0x271e ✞ 24 10015 0x271f ✟ 25 10016 0x2720 ✠ 26 10017 0x2721 ✡ 27 10018 0x2722 ✢ 28 10019 0x2723 ✣ 29 10020 0x2724 ✤
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 for row in range(1,10): 2 #打印行,换行 3 for col in range(1,row+1): 4 print("%d*%d=%d" % (row,col,row*col),end=' ' ) 5 print() 6 1*1=1 7 2*1=2 2*2=4 8 3*1=3 3*2=6 3*3=9 9 4*1=4 4*2=8 4*3=12 4*4=16 10 5*1=5 5*2=10 5*3=15 5*4=20 5*5=25 11 6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36 12 7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49 13 8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64 14 9*1=9 9*2=18 9*3=27 9*4=36 9*5=45 9*6=54 9*7=63 9*8=72 9*9=81
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #方法1 2 a = 1 3 b = 1 4 print(a, end=' ') 5 print(b, end=' ') 6 for x in range(18): 7 n = a + b 8 print(n, end=' ') 9 a = b 10 b = n 11 print() 12 #方法2 13 a = 1 14 b = 1 15 print(a, end=' ') 16 print(b, end=' ') 17 for x in range(18): 18 print(a+b, end= ' ') 19 a,b = b , a + b 20 print() 21 #方法3 22 a = 1 23 b = 1 24 for x in range(20): 25 print(a, end=' ') 26 a , b = b, a + b 27 print() 28 #方法4 29 a = 1 30 b = 1 31 L = [] 32 for x in range(20): 33 L.append(a) 34 a, b = b, a + b 35 for x in L: 36 print(x, end=' ') 37 print(L)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #方法1 2 a = 1 3 b = 1 4 print(a, end=' ') 5 print(b, end=' ') 6 for x in range(18): 7 n = a + b 8 print(n, end=' ') 9 a = b 10 b = n 11 print() 12 #方法2 13 a = 1 14 b = 1 15 print(a, end=' ') 16 print(b, end=' ') 17 for x in range(18): 18 print(a+b, end= ' ') 19 a,b = b , a + b 20 print() 21 #方法3 22 a = 1 23 b = 1 24 for x in range(20): 25 print(a, end=' ') 26 a , b = b, a + b 27 print() 28 #方法4 29 a = 1 30 b = 1 31 L = [] 32 for x in range(20): 33 L.append(a) 34 a, b = b, a + b 35 for x in L: 36 print(x, end=' ') 37 print() 38 print(L) 39 #方法5 40 L = [1,1] 41 while len(L) < 20: 42 L.append(L[-1] + L[-2]) 43 print(L) 44 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 45 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 46 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 47 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 48 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765] 49 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #1 + 2 + 3 =6 2 #1 + 2 + 14 + 4 + 7 =28 3 4 n = 1 5 while True: 6 #判断是否为完全数,是则打印 7 YinShu = [] #存放因数 8 for x in range(1,n): 9 if n % x == 0: 10 YinShu.append(x) 11 #判断因数之和是否等于n 12 if sum(YinShu) == n: 13 print(n, "是完全数.") 14 n += 1 15 16 17 6 是完全数. 18 28 是完全数. 19 496 是完全数. 20 8128 是完全数.
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 L = [] 2 for i in range(1,6): 3 n = input("请输入姓名:") 4 a = input("请输入年龄:") 5 # print({"name": n , "age": a}) 6 d1 = {"name": n , "age": a} 7 L.append(d1) 8 i += 1 9 print(L) 10 11 print('+' + '-' * 10 + '+' + '-' * 10 + '+' ) 12 print('|' + '姓名'.center(8) + '|'+ '年龄'.center(8) + '|') 13 print('+' + '-' * 10 + '+' + '-' * 10 + '+' ) 14 print('|' + str(L[0]['name']).center(10) + '|'+ str(L[0]['age']).center(10) + '|') 15 print('|' + str(L[1]['name']).center(10) + '|'+ str(L[1]['age']).center(10) + '|') 16 print('|' + str(L[2]['name']).center(10) + '|'+ str(L[2]['age']).center(10) + '|') 17 print('|' + str(L[3]['name']).center(10) + '|'+ str(L[3]['age']).center(10) + '|') 18 print('|' + str(L[4]['name']).center(10) + '|'+ str(L[4]['age']).center(10) + '|') 19 print('+' + '-' * 10 + '+' + '-' * 10 + '+' ) 20 21 请输入姓名:xiaoming 22 请输入年龄:18 23 请输入姓名:xiaoli 24 请输入年龄:19 25 请输入姓名:xiaogang 26 请输入年龄:20 27 请输入姓名:xiaohong 28 请输入年龄:21 29 请输入姓名:xiaomi 30 请输入年龄:22 31 [{'age': '18', 'name': 'xiaoming'}, {'age': '19', 'name': 'xiaoli'}, {'age': '20', 'name': 'xiaogang'}, {'age': '21', 'name': 'xiaohong'}, {'age': '22', 'name': 'xiaomi'}] 32 +----------+----------+ 33 | 姓名 | 年龄 | 34 +----------+----------+ 35 | xiaoming | 18 | 36 | xiaoli | 19 | 37 | xiaogang | 20 | 38 | xiaohong | 21 | 39 | xiaomi | 22 | 40 +----------+----------+
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 L = [] 2 for i in range(1,6): 3 n = input("请输入第"+ str(i) +"学生的姓名:") 4 a = int(input("请输入第"+ str(i) +"学生的年龄:")) 5 d1 = {"name": n , "age": a} 6 L.append(d1) 7 print(L) 8 9 10 L1 = L.copy() 11 print('+' + '-' * 10 + '+' + '-' * 10 + '+' ) 12 print('|' + '姓名'.center(8) + '|'+ '年龄'.center(8) + '|', sep='') 13 print('+' + '-' * 10 + '+' + '-' * 10 + '+' ) 14 for d in L1: 15 print('|' + d['name'].center(10) + '|' + str(d['age']).center(10) + '|',sep='') 16 print('+' + '-' * 10 + '+' + '-' * 10 + '+') 17 18 #判断学生的年龄 19 s = int(input("输入学生的年龄:")) 20 L1.clear() 21 for d in L: 22 if d['age'] < s: 23 #print(d) 24 L1.append(d) 25 print("年龄低于" + str(s) + "岁的学生信息如下:") 26 print('+' + '-' * 10 + '+' + '-' * 10 + '+' ) 27 print('|' + '姓名'.center(8) + '|'+ '年龄'.center(8) + '|', sep='') 28 print('+' + '-' * 10 + '+' + '-' * 10 + '+' ) 29 for d in L1: 30 print('|' + d['name'].center(10) + '|' + str(d['age']).center(10) + '|',sep='') 31 print('+' + '-' * 10 + '+' + '-' * 10 + '+') 32 33 请输入第1学生的姓名:xiaoming 34 请输入第1学生的年龄:13 35 请输入第2学生的姓名:xiaoli 36 请输入第2学生的年龄:15 37 请输入第3学生的姓名:xiaogang 38 请输入第3学生的年龄:16 39 请输入第4学生的姓名:xiaomi 40 请输入第4学生的年龄:18 41 请输入第5学生的姓名:xiaohong 42 请输入第5学生的年龄:19 43 [{'name': 'xiaoming', 'age': 13}, {'name': 'xiaoli', 'age': 15}, {'name': 'xiaogang', 'age': 16}, {'name': 'xiaomi', 'age': 18}, {'name': 'xiaohong', 'age': 19}] 44 +----------+----------+ 45 | 姓名 | 年龄 | 46 +----------+----------+ 47 | xiaoming | 13 | 48 | xiaoli | 15 | 49 | xiaogang | 16 | 50 | xiaomi | 18 | 51 | xiaohong | 19 | 52 +----------+----------+ 53 输入学生的年龄:18 54 年龄低于18岁的学生信息如下: 55 +----------+----------+ 56 | 姓名 | 年龄 | 57 +----------+----------+ 58 | xiaoming | 13 | 59 | xiaoli | 15 | 60 | xiaogang | 16 | 61 +----------+----------+
输入重定向:
$ 命令 < 输入文件
作用:将文件中的内容重定向为一个命令的输出(此时标准键盘输入无效)