Python之路,第九篇:Python入门与基础9

时间:2023-07-04 08:34:32

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 |
+----------+----------+

输入重定向:

$ 命令   <  输入文件

作用:将文件中的内容重定向为一个命令的输出(此时标准键盘输入无效)