大鹏

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

集合:在我的世界里,你就是唯一

 本章内容:

  1、集合的作用
  2、创建集合
    2.1去重复
  3、访问集合
  4、不可变集合
  5、常用的方法
  6、练习
  7、作业

  8、参考

 

 

1、集合在python中几乎起到的所有作用就是两个字:唯一

集合是一个无序的,不重复的数据组合,它的主要作用如下:

  • 去重,把一个列表变成集合,就自动去重了
  • 关系测试,测试两组数据之前的交集、差集、并集等关系
num1 = {}
print(type(num1))   # <class 'dict'>
num2 = {1,2,3,4,5}
print(type(num2))   # <class 'set'>

 

#去重复
num = {1,2,3,4,5,4,3,2,1}
print(num)       #去重
# {1, 2, 3, 4, 5}

#集合是无序的,不要试图去索引集合的某一个元素
print(num[2])  
# TypeError: 'set' object does not support indexing

 

#作用:去重,关系运算,

#定义:
            知识点回顾
            可变类型是不可hash类型
            不可变类型是可hash类型

#定义集合:
            集合:可以包含多个元素,用逗号分割,
            集合的元素遵循三个原则:
             1:每个元素必须是不可变类型(可hash,可作为字典的key)
             2:没有重复的元素
             3:无序

注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值
 

#优先掌握的操作:
#1、长度len
#2、成员运算in和not in

#3、|合集
#4、&交集
#5、-差集
#6、^对称差集
#7、==
#8、父集:>,>= 
#9、子集:<,<=  

 

 

 

2、创建集合

创建集合有两种方法:一是直接把一堆元素用大括号({})扩起来;二是用set()

#方式一
set1 = {"小甲鱼",'小鱿鱼','小护士','小甲鱼'}

#方式二
set2 = set(["小甲鱼",'小鱿鱼','小护士','小甲鱼'])

set1 = set2   # True
print(set1)
print(set2)

#{'小甲鱼', '小鱿鱼', '小护士'}
#{'小甲鱼', '小鱿鱼', '小护士'}

 

2.1去重复

#列表中去重

list1 = [1,2,3,4,5,5,3,1,0]
temp = list1[:]
list1.clear()
for each in temp:
    if each not in list1:
        list1.append(each)

print(list1)   # [1, 2, 3, 4, 5, 0]


#使用集合的方式
list1 = [1,2,3,4,5,5,3,1,0]
list1 = list(set(list1))
print(list1)   # [0, 1, 2, 3, 4, 5]
 
#注意set() 是无序的,会改变原来的顺序,对顺序有要求的,慎用

 

二.去重

   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'},
] 


#去重,无需保持原来的顺序
l=['a','b',1,'a','a']
print(set(l))

#去重,并保持原来的顺序
#方法一:不用集合
l=[1,'a','b',1,'a']

l1=[]
for i in l:
    if i not in l1:
        l1.append(i)
print(l1)
#方法二:借助集合
l1=[]
s=set()
for i in l:
    if i not in s:
        s.add(i)
        l1.append(i)

print(l1)


#同上方法二,去除文件中重复的行
import os
with open('db.txt','r',encoding='utf-8') as read_f,\
        open('.db.txt.swap','w',encoding='utf-8') as write_f:
    s=set()
    for line in read_f:
        if line not in s:
            s.add(line)
            write_f.write(line)
os.remove('db.txt')
os.rename('.db.txt.swap','db.txt')

#列表中元素为可变类型时,去重,并且保持原来顺序
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'},
]
# print(set(l)) #报错:unhashable type: 'dict'
s=set()
l1=[]
for item in l:
    val=(item['name'],item['age'],item['sex'])
    if val not in s:
        s.add(val)
        l1.append(item)

print(l1)






#定义函数,既可以针对可以hash类型又可以针对不可hash类型
def func(items,key=None):
    s=set()
    for item in items:
        val=item if key is None else key(item)
        if val not in s:
            s.add(val)
            yield item

print(list(func(l,key=lambda dic:(dic['name'],dic['age'],dic['sex']))))
参考
 

 

 

 

 

3、访问集合

由于集合中的元素是无序的,所有不能像序列那样使用下标来进行访问,但可以使用迭代把集合中的数据一个个读取出来

set1 = {1,2,3,4,5,6,4,3,2,1,0}

for each in set1:
    print(each,end=',')

# 0,1,2,3,4,5,6,

 

# 使用in 和not in
print( 0 in set1)         # True
print('00' in set1)       #False
print('xx' not in set1)   # True

 

4、不可变集合

frozenset() 定义一个不可变集合

set1 = frozenset({1,2,3,4,5})
set1.add(6)

# 报错 AttributeError: 'frozenset' object has no attribute 'add'

 

5、常用的方法

使用help(set) 查看帮助文档,使用dir(set)查看它有那些方法

 

for each in dir(set):
    print(each)
 add
    clear
    copy
    difference
    difference_update
    discard
    intersection
    intersection_update
    isdisjoint
    issubset
    issuperset
    pop
    remove
    symmetric_difference
    symmetric_difference_update
    union
    update
结果

 

#基本操作:

t.add('x')            # 添加一项

s.update([10 ,37 ,42])  # 在s中添加多项


t.remove('H')    #使用remove( )  可以删除一项:


len(s)           #set 的长度

x in s           #测试 x 是否是 s 的成员

x not in s       #测试 x 是否不是 s 的成员

s.issubset(t)
s <= t           #测试是否 s 中的每一个元素都在 t 中

s.issuperset(t)
s >= t          #测试是否 t 中的每一个元素都在 s 中

s.union(t)
s | t           #返回一个新的 set 包含 s 和 t 中的每一个元素

s.intersection(t)
s & t           #返回一个新的 set 包含 s 和 t 中的公共元素

s.difference(t)
s - t           #返回一个新的 set 包含 s 中有但是 t 中没有的元素

s.symmetric_difference(t)
s ^ t           #返回一个新的 set 包含 s 和 t 中不重复的元素

s.copy()        #返回 set “s”的一个浅复制

 

6、练习

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

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

 

 

7、作业

[课后作业] 第027讲:集合:在我的世界里,你就是唯一 | 课后测试题

 

8、参考:

http://www.cnblogs.com/haiyan123/p/7218245.html

http://www.cnblogs.com/linhaifeng/articles/7133357.html#_label7

http://www.cnblogs.com/wupeiqi/articles/4911365.html

基础数据类型(set集合)

 

posted on 2018-12-15 19:32  pf42280  阅读(205)  评论(0)    收藏  举报