python 13day--集合、字符串格式化

一、set是一个无序且不重复的元素集合

1、集合需要掌握的知识点:

 1 #作用:去重,关系运算,
 2 
 3 #定义:
 4             知识点回顾
 5             可变类型是不可hash类型
 6             不可变类型是可hash类型
 7 
 8 #定义集合:
 9             集合:可以包含多个元素,用逗号分割,
10             集合的元素遵循三个原则:
11              1:每个元素必须是不可变类型(可hash,可作为字典的key)
12              2:没有重复的元素
13              3:无序
14 
15 注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值
16  
17 
18 #优先掌握的操作:
19 #1、长度len
20 #2、成员运算in和not in
21 
22 #3、|合集
23 #4、&交集
24 #5、-差集
25 #6、^对称差集
26 #7、==
27 #8、父集:>,>= #9、子集:<,<=

2、集合的关系运算

  一.关系运算
  有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
  pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
  linuxs={'wupeiqi','oldboy','gangdan'}
  1. 求出即报名python又报名linux课程的学员名字集合
  2. 求出所有报名的学生名字集合
  3. 求出只报名python课程的学员名字
  4. 求出没有同时这两门课程的学员名字集合

  

 1 # 有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合
 2 pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'}
 3 linuxs={'wupeiqi','oldboy','gangdan'}
 4 # 求出即报名python又报名linux课程的学员名字集合
 5 print(pythons & linuxs)
 6 # 求出所有报名的学生名字集合
 7 print(pythons | linuxs)
 8 # 求出只报名python课程的学员名字
 9 print(pythons - linuxs)
10 # 求出没有同时这两门课程的学员名字集合
11 print(pythons ^ linuxs)

3、集合的应用举例:

二.去重

   1. 有列表l=['a','b',1,'a','a'],列表元素均为可hash类型,去重,得到新列表,且新列表无需保持列表原来的顺序

   2.在上题的基础上,保存列表原来的顺序

   3.去除文件中重复的行,肯定要保持文件内容的顺序不变
   4.有如下列表,列表元素为不可hash类型,去重,得到新列表,且新列表一定要保持列表原来的顺序

l=[
    {'name':'egon','age':18,'sex':'male'},
    {'name':'alex','age':73,'sex':'male'},
    {'name':'egon','age':20,'sex':'female'},
    {'name':'egon','age':18,'sex':'male'},
    {'name':'egon','age':18,'sex':'male'},
]
 1 #去重,无需保持原来的顺序
 2 l=['a','b',1,'a','a']
 3 print(set(l))
 4 
 5 #去重,并保持原来的顺序
 6 #方法一:不用集合
 7 l=[1,'a','b',1,'a']
 8 
 9 l1=[]
10 for i in l:
11     if i not in l1:
12         l1.append(i)
13 print(l1)
14 #方法二:借助集合
15 l1=[]
16 s=set()
17 for i in l:
18     if i not in s:
19         s.add(i)
20         l1.append(i)
21 
22 print(l1)
23 
24 
25 #同上方法二,去除文件中重复的行
26 import os
27 with open('db.txt','r',encoding='utf-8') as read_f,
28         open('.db.txt.swap','w',encoding='utf-8') as write_f:
29     s=set()
30     for line in read_f:
31         if line not in s:
32             s.add(line)
33             write_f.write(line)
34 os.remove('db.txt')
35 os.rename('.db.txt.swap','db.txt')
36 
37 #列表中元素为可变类型时,去重,并且保持原来顺序
38 l=[
39     {'name':'egon','age':18,'sex':'male'},
40     {'name':'alex','age':73,'sex':'male'},
41     {'name':'egon','age':20,'sex':'female'},
42     {'name':'egon','age':18,'sex':'male'},
43     {'name':'egon','age':18,'sex':'male'},
44 ]
45 # print(set(l)) #报错:unhashable type: 'dict'
46 s=set()
47 l1=[]
48 for item in l:
49     val=(item['name'],item['age'],item['sex'])
50     if val not in s:
51         s.add(val)
52         l1.append(item)
53 
54 print(l1)
55 
56 
57 
58 
59 
60 
61 #定义函数,既可以针对可以hash类型又可以针对不可hash类型
62 def func(items,key=None):
63     s=set()
64     for item in items:
65         val=item if key is None else key(item)
66         if val not in s:
67             s.add(val)
68             yield item
69 
70 print(list(func(l,key=lambda dic:(dic['name'],dic['age'],dic['sex']))))

二、字符串格式

1、c语言式的格式化方法之占位符

str1 ='sb'
str2 ='big'
print('alex is a %s %s'%(str2,str1))

2、利用format格式化

1 dic = {'a1':'big','a2':'sb'}
2 print('alex is a {0} {1}'.format(str2,str1))
3 print('alex is a {a1} {a2}'.format(a1= "big",a2='sb'))
原文地址:https://www.cnblogs.com/yuzhiboyou/p/10135254.html