python3 集合set
集合set概念
集合是可变的容器;满足数学意义上的定义,求并集交集等
集合内的数据对象都是唯一的(不能重复多次)
集合是无序的存储结构,集合中的数据没有先后关系
集合是相当于只有键,没有值的字典,则键是集合的数据、
集合内的元素必须是不可变对象
集合是可迭代的(可以用for等遍历)
生成空集合:
set()
生成非空集合:
set(iterable) 函数
>>> set([3,5,7,9])
{9, 3, 5, 7}
>>> set("xiaoming")
{'o', 'a', 'x', 'i', 'n', 'm', 'g'}
>>> set("ABCCBA")
{'B', 'C', 'A'}
>>> s = set({"name":"xiaoming","age":12})
>>> s
{'age', 'name'}
>>> type(s)
<class 'set'>
>>> s1 = ( ("ABC", 123, True) )
>>> s1
('ABC', 123, True)
>>> s2 = {True, None, "ABC", (1,2,3), 3.14}
>>> s2
{True, 'ABC', 3.14, None, (1, 2, 3)}
>>> type(s2)
<class 'set'>
>>>
集合的运算:
交集, 并集, 补集, 子集, 超集
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
集合是可迭代对象;
>>> s = {"abc",123, (1910,1,1)}
>>> for x in s:
print(x) 123
abc
(1910, 1, 1)
>>>
字典也是可迭代对象;
>>> d = {'name':'xiaoming',(2011,1,1):'生日'}
>>> for x in d:
print(x) (2011, 1, 1)
name
>>>
用于集合的函数
len(x) 返回长度
max(x) 返回最大值
min(x) 返回最小值
sum(x) 返回和
any(x) 真值测试,任意为真,则返回True,否则为False
all(x) 真值测试,所有为真,则返回True,否则为False
集合推导式:
语法: {表达式 if 变量 in 可迭代对象 (if 条件表达式)}
集合推导式可以嵌套;
>>> names = ['a','b','c','d','e']
>>> a_set = { n for n in names}
>>> print(a_set)
{'a', 'd', 'b', 'c', 'e'}
>>> names = ['a','b','c','d','e','a','b','c','d','e']
>>> a_set = {n for n in names}
>>> print(a_set)
{'a', 'd', 'b', 'c', 'e'}
>>> {x for x in range(10)}
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
>>> {x:x for x in range(1,10)}
{1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9}
>>>
总结:
python3中 三种可变的数据类型: list 、 dict、 set
固定集合 frozenset
概念:创建一个不可变的,无序的,含有唯一元素的集合;
创建一个空的固定集合
frozenset()
创建一个非空的固定集合
frozenset(iterable)
>>> frozenset()
frozenset()
>>> frozenset([1,2,3,4,5])
frozenset({1, 2, 3, 4, 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
#!/usr/bin/python for x in range(1, 21):
print(x, end=' ')
if x % 5 == 0:
print() >>> ================================ RESTART ================================
>>>
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
>>>
#!/usr/bin/python for x in range(1, 21):
print(x, end=' ')
print() >>> ================================ RESTART ================================
>>>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
>>>
h = int(input("请打印树干高度:"))
#打印树冠
for x in range(h):
print( ' ' * ( h - x - 1 ) + '*' * ( 2 * x + 1 ) )
#打印树干
for x in range(h):
print( ' ' * ( h - 1 ) + '*' ) 请打印树干高度:4
*
***
*****
*******
*
*
*
*
begin = int(input("请输入开始值:"))
end = int(input("请输入结束值:"))
print("十进制编码 十六进制编码 文字")
for x in range(begin, (end+1)):
print(str(x).center(11), hex(x).center(14), chr(x))
请输入开始值:10000
请输入结束值:10020
十进制编码 十六进制编码 文字
10000 0x2710 ✐
10001 0x2711 ✑
10002 0x2712 ✒
10003 0x2713 ✓
10004 0x2714 ✔
10005 0x2715 ✕
10006 0x2716 ✖
10007 0x2717 ✗
10008 0x2718 ✘
10009 0x2719 ✙
10010 0x271a ✚
10011 0x271b ✛
10012 0x271c ✜
10013 0x271d ✝
10014 0x271e ✞
10015 0x271f ✟
10016 0x2720 ✠
10017 0x2721 ✡
10018 0x2722 ✢
10019 0x2723 ✣
10020 0x2724 ✤
for row in range(1,10):
#打印行,换行
for col in range(1,row+1):
print("%d*%d=%d" % (row,col,row*col),end=' ' )
print()
1*1=1
2*1=2 2*2=4
3*1=3 3*2=6 3*3=9
4*1=4 4*2=8 4*3=12 4*4=16
5*1=5 5*2=10 5*3=15 5*4=20 5*5=25
6*1=6 6*2=12 6*3=18 6*4=24 6*5=30 6*6=36
7*1=7 7*2=14 7*3=21 7*4=28 7*5=35 7*6=42 7*7=49
8*1=8 8*2=16 8*3=24 8*4=32 8*5=40 8*6=48 8*7=56 8*8=64
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
#方法1
a = 1
b = 1
print(a, end=' ')
print(b, end=' ')
for x in range(18):
n = a + b
print(n, end=' ')
a = b
b = n
print()
#方法2
a = 1
b = 1
print(a, end=' ')
print(b, end=' ')
for x in range(18):
print(a+b, end= ' ')
a,b = b , a + b
print()
#方法3
a = 1
b = 1
for x in range(20):
print(a, end=' ')
a , b = b, a + b
print()
#方法4
a = 1
b = 1
L = []
for x in range(20):
L.append(a)
a, b = b, a + b
for x in L:
print(x, end=' ')
print(L)
#方法1
a = 1
b = 1
print(a, end=' ')
print(b, end=' ')
for x in range(18):
n = a + b
print(n, end=' ')
a = b
b = n
print()
#方法2
a = 1
b = 1
print(a, end=' ')
print(b, end=' ')
for x in range(18):
print(a+b, end= ' ')
a,b = b , a + b
print()
#方法3
a = 1
b = 1
for x in range(20):
print(a, end=' ')
a , b = b, a + b
print()
#方法4
a = 1
b = 1
L = []
for x in range(20):
L.append(a)
a, b = b, a + b
for x in L:
print(x, end=' ')
print()
print(L)
#方法5
L = [1,1]
while len(L) < 20:
L.append(L[-1] + L[-2])
print(L)
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765]
#1 + 2 + 3 =6
#1 + 2 + 14 + 4 + 7 =28 n = 1
while True:
#判断是否为完全数,是则打印
YinShu = [] #存放因数
for x in range(1,n):
if n % x == 0:
YinShu.append(x)
#判断因数之和是否等于n
if sum(YinShu) == n:
print(n, "是完全数.")
n += 1 6 是完全数.
28 是完全数.
496 是完全数.
8128 是完全数.
L = []
for i in range(1,6):
n = input("请输入姓名:")
a = input("请输入年龄:")
# print({"name": n , "age": a})
d1 = {"name": n , "age": a}
L.append(d1)
i += 1
print(L) print('+' + '-' * 10 + '+' + '-' * 10 + '+' )
print('|' + '姓名'.center(8) + '|'+ '年龄'.center(8) + '|')
print('+' + '-' * 10 + '+' + '-' * 10 + '+' )
print('|' + str(L[0]['name']).center(10) + '|'+ str(L[0]['age']).center(10) + '|')
print('|' + str(L[1]['name']).center(10) + '|'+ str(L[1]['age']).center(10) + '|')
print('|' + str(L[2]['name']).center(10) + '|'+ str(L[2]['age']).center(10) + '|')
print('|' + str(L[3]['name']).center(10) + '|'+ str(L[3]['age']).center(10) + '|')
print('|' + str(L[4]['name']).center(10) + '|'+ str(L[4]['age']).center(10) + '|')
print('+' + '-' * 10 + '+' + '-' * 10 + '+' ) 请输入姓名:xiaoming
请输入年龄:18
请输入姓名:xiaoli
请输入年龄:19
请输入姓名:xiaogang
请输入年龄:20
请输入姓名:xiaohong
请输入年龄:21
请输入姓名:xiaomi
请输入年龄:22
[{'age': '', 'name': 'xiaoming'}, {'age': '', 'name': 'xiaoli'}, {'age': '', 'name': 'xiaogang'}, {'age': '', 'name': 'xiaohong'}, {'age': '', 'name': 'xiaomi'}]
+----------+----------+
| 姓名 | 年龄 |
+----------+----------+
| xiaoming | 18 |
| xiaoli | 19 |
| xiaogang | 20 |
| xiaohong | 21 |
| xiaomi | 22 |
+----------+----------+
L = []
for i in range(1,6):
n = input("请输入第"+ str(i) +"学生的姓名:")
a = int(input("请输入第"+ str(i) +"学生的年龄:"))
d1 = {"name": n , "age": a}
L.append(d1)
print(L) L1 = L.copy()
print('+' + '-' * 10 + '+' + '-' * 10 + '+' )
print('|' + '姓名'.center(8) + '|'+ '年龄'.center(8) + '|', sep='')
print('+' + '-' * 10 + '+' + '-' * 10 + '+' )
for d in L1:
print('|' + d['name'].center(10) + '|' + str(d['age']).center(10) + '|',sep='')
print('+' + '-' * 10 + '+' + '-' * 10 + '+') #判断学生的年龄
s = int(input("输入学生的年龄:"))
L1.clear()
for d in L:
if d['age'] < s:
#print(d)
L1.append(d)
print("年龄低于" + str(s) + "岁的学生信息如下:")
print('+' + '-' * 10 + '+' + '-' * 10 + '+' )
print('|' + '姓名'.center(8) + '|'+ '年龄'.center(8) + '|', sep='')
print('+' + '-' * 10 + '+' + '-' * 10 + '+' )
for d in L1:
print('|' + d['name'].center(10) + '|' + str(d['age']).center(10) + '|',sep='')
print('+' + '-' * 10 + '+' + '-' * 10 + '+') 请输入第1学生的姓名:xiaoming
请输入第1学生的年龄:13
请输入第2学生的姓名:xiaoli
请输入第2学生的年龄:15
请输入第3学生的姓名:xiaogang
请输入第3学生的年龄:16
请输入第4学生的姓名:xiaomi
请输入第4学生的年龄:18
请输入第5学生的姓名:xiaohong
请输入第5学生的年龄:19
[{'name': 'xiaoming', 'age': 13}, {'name': 'xiaoli', 'age': 15}, {'name': 'xiaogang', 'age': 16}, {'name': 'xiaomi', 'age': 18}, {'name': 'xiaohong', 'age': 19}]
+----------+----------+
| 姓名 | 年龄 |
+----------+----------+
| xiaoming | 13 |
| xiaoli | 15 |
| xiaogang | 16 |
| xiaomi | 18 |
| xiaohong | 19 |
+----------+----------+
输入学生的年龄:18
年龄低于18岁的学生信息如下:
+----------+----------+
| 姓名 | 年龄 |
+----------+----------+
| xiaoming | 13 |
| xiaoli | 15 |
| xiaogang | 16 |
+----------+----------+
输入重定向:
$ 命令 < 输入文件
作用:将文件中的内容重定向为一个命令的输出(此时标准键盘输入无效)