07. Python语言的核心编程 · 第七章 Python的元组&字典&集合

1. 元组简介

元组基本介绍:
  1) 元组表现形式是 tuple
  2) Python的 元组列表 类似不同之处在于元组的元素不能修改。所以 元组是一个不可变序列(一般当我们希望数据不改变时,我们使用元组,其他情况下基本都用列表)

1.1 元组的 增

  3) 元组使用小括号() 创建元素

# 创建一个 空元组
tuple = ()

  4) 元组创建很简单,只需要在括号中添加元素,元素之间使用逗号隔开即可;当元组不是空元组时括号可以省略。

>>>tup1 = ('Google', 'Runoob', 1997, 2000)
>>> tup2 = (1, 2, 3, 4, 5 )
>>> tup3 = "a", "b", "c", "d"   #  不需要括号也可以
>>> type(tup3)
<class 'tuple'>

  5) 元组中 只包含一个元素 时,需要在元素后面添加逗号,否则括号会被当作运算符使用:

>>>tup1 = (50)
>>> type(tup1)     # 不加逗号,类型为整型
<class 'int'>
 
>>> tup1 = (50,)
>>> type(tup1)     # 加上逗号,类型为元组
<class 'tuple'>

  元组与字符串类似,下标索引从0开始,可以进行截取,组合等。

1.2 元组的 改

  6) 修改元组:元组中的元素值是不允许修改的,但我们可以对元组进行连接组合

tup1 = (12, 34.56)
tup2 = ('abc', 'xyz')
 
# 以下修改元组元素操作是非法的。
# tup1[0] = 100
 
# 创建一个新的元组
tup3 = tup1 + tup2
print (tup3)
# (12, 34.56, 'abc', 'xyz')

1.3 元组的 删

  7) 删除元组:元组中的元素值是不允许删除的,但我们可以使用 del语句删除整个元组

tup = ('Google', 'CSDN', 1997, 2000)
 
print (tup)

del tup
print ("删除后的元组 tup : ")

print (tup)

# 删除后的元组 tup : 
# Traceback (most recent call last):
#   File "test.py", line 8, in <module>
#     print (tup)
# NameError: name 'tup' is not defined

1.4 元组的 查

  8) 访问元组:元组可以使用下标索引来访问元组中的

tup1 = ('Google', 'CSDN', 1997, 2000)
tup2 = (1, 2, 3, 4, 5, 6, 7 )
 
print ("tup1[0]: ", tup1[0])
# tup1[0]:  Google
print ("tup2[1:5]: ", tup2[1:5])
# tup2[1:5]:  (2, 3, 4, 5)

  9) 元组解包 指将元组当中的每一个元素都赋值给一个变量

my_tuple = 10,20,30,40  # 当元组不为空时,括号是可以省略的

a,b,c,d = my_tuple  # 元组的解包     解包就是指将元组当中的每一个元素都赋值给变量

print('a =',a)
print('b =',b)
print('c =',c)
print('d =',d)
# a = 10
# b = 20
# c = 30
# d = 40

# 在元组解包时,变量的数量必须和元组中的数据一一对应;
# 如果出现的变量和元组中元素数量不一致时,在收纳多余元素的变量前加 * ;
# 变量数量不可多于元组中的元素数量

# a,b = my_tuple  # 值太多了,变量不够。    # ValueError: too many values to unpack (expected 2)

a,b,*c = my_tuple   # * :以 列表 的形式,把剩余的元素打包赋值给 c

print('a =',a)
print('b =',b)
print('*c =',*c)
# a = 10
# b = 20
# *c = 30 40

# a,b,*c = [1,2,3,4,5,6,7,8,9]

a,b,*c = 'python and JAVA'

print('a =',a)
print('b =',b)
print('*c =',*c)
print('c =',c)
# a = p
# b = y
# *c = t h o n   a n d   J A V A
# c = ['t', 'h', 'o', 'n', ' ', 'a', 'n', 'd', ' ', 'J', 'A', 'V', 'A']

print(my_tuple,type(my_tuple))
# (10, 20, 30, 40) <class 'tuple'>

print(my_tuple[3])
# 40

  10) 元组索引,截取:因为元组也是一个序列,所以我们可以访问元组中的指定位置的元素,也可以 截取索引中的一段元素

# 创建一个元组
L = ('Google', 'Taobao', 'Runoob')

在这里插入图片描述
  运行实例如下:

>>> L = ('Google', 'Taobao', 'Runoob')
>>> L[2]
'Runoob'
>>> L[-2]
'Taobao'
>>> L[1:]
('Taobao', 'Runoob')

1.5 元组的 运算符 和 操作函数

  11) 元组运算符:与字符串一样,元组之间可以使用 + 号和 * 号进行运算。这就意味着他们可以 组合复制,运算后会生成一个 新的元组
在这里插入图片描述

  12) 元组内置函数:Python元组包含了以下内置函数
在这里插入图片描述

  最后 简单的解释一下为什么“元组是不可变的:所谓 元组的不可变 指的是元组所指向的内存中的内容不可变。

>>> tup = ('C', 'S', 'D', 'N')
>>> tup[0] = 'g'     # 不支持修改元素
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object does not support item assignment
>>> id(tup)     # 查看内存地址
4440687904
>>> tup = (1,2,3)
>>> id(tup)
4441088800    # 内存地址不一样了

  从以上实例可以看出,重新赋值的元组 tup,绑定到新的对象了,不是修改了原来的对象

  

2. 可变对象

  Python中 数值类型(int和float)、字符串str、元组tuple 都是 不可变类型 ;而 列表list、字典dict、集合set 是 可变类型
  可变对象中都保存了三个数据:
  id(标识)  type(类型)  value(值)
  在这里,我们说的可变变量指的是我们可以对对象里面的 value 进行改变

2.1 第一个可变对象方法:修改列表

a = [1,2,3]
a[0] = 10 		# (改对象)

print(a)
# [10, 2, 3]

  这个操作是通过变量修改对象的
  这种操作不会改变变量所指向对象

a = [1,2,3]
print('修改前:',a,id(a))
# 修改前: [1, 2, 3] 2048896738112

a = [1,2,3]
print('修改后:',a,id(a))
# 修改前: [1, 2, 3] 2048896731392

  这个操作在给变量 重复赋值
  这种操作会改变变量所指向存储对象

  如果不太理解上面这段话想传递给你的意思,我给你一个能让你快速理解上面这段话的方法和思想实验:多创建几个 相同的变量 a ,创建好后 打印它们的id 看输出的后 你应该能理解。这个反馈的id的值就是这个 变量 a 在我们使用的硬盘里的位置 。你有十几个或几百个和你的 长相长得 一模一样的“兄弟 或者是 和你的 名字 一模一样,虽然他们都和你 住在同一个地球上,但你们 不可能会 住在同一个国家同一个城市同一个小区同一个房间

2.2 第二个可变对象方法:修改索引

a = [1,2,3]
print('修改前:',a,id(a))
# 修改前: [1, 2, 3] 2048896738112

# 通过索引修改列表
a[0] = 30
print('修改后:',a,id(a))
# 修改后: [30, 2, 3] 2020252459904

2.3 第三个可变对象方法:修改变量

a = [1,2,3]
print('修改前:',a,id(a))
# 修改前: [1, 2, 3] 2048896738112

# 通过变量给列表重新赋值
a = [7,8,9]
print('修改后:',a,id(a))
# 修改后: [7, 8, 9] 2681969838464

2.4 接下来我们讲第三个可变对象方法:修改对象

  修改对象里的值会影响到所有指向该对象的 变量值,但不会改变该对象的 id

a = [1,2,3]
print('修改前:',a,id(a))
# 修改前: [1, 2, 3] 2048896738112

# 修改对象里的值会影响到所有指向该对象的变量值,但不会改变该对象的 id
b = a
b[0] = 30
print('修改后:',b,id(b))
# 修改后: [30, 2, 3] 2048896738112

  修改对象的列表 不仅会影响到所有指向该对象的 变量值,还会改变该对象的 id

a = [1,2,3]
print('修改前:',a,id(a))
# 修改前: [1, 2, 3] 2048896738112

# 修改对象里的列表 不仅会影响到所有指向该对象的变量值,还会改变该对象的 id 
b = a
b = [50,60,90]
print('修改后:',b,id(b))
# 修改后: [50, 60, 90] 2823356090688

  

3. 字典简介

3.1 字典的基本介绍

  “字典”,我第一次听到这个词的时候给我的第一感觉还是怪瘆人的为什么? 原因很简单:因为,学习了计算机这么久,但是以前都没听过。现在我就给大家简单通俗易懂的解释一下 什么是Python语言里的“字典”
  Python语言 里有种一种可变容器模型,且可存储任意类型对象;它的特点是 能对数据快速进行检索。我们对这类 数据存储方式 ,叫“ 键(key)·值(value)对(key-value) ”,它的整体布局使用就像我们小时候使用的 《新华字典》一样一样的;所以,我们简称这种数据存储格式为 “字典”;通过 “键(key)” 来索引查找相对的“值(value)”。字典的 值(value) 可以是 任意对象,你没有看错;但字典的键(key) 可以是 任意的不可变对象 ;简单的讲,不同版本《新华字典》 内容还是大同小异的,但页数基本不变的(加量不加价的…);内容是可以随着版本不断的更新改变的,但那一页对应的是什么内容不可更改的。字典的 键(key)不能重复的,就像一本字典里不可能出现内容不同却页数相同两页(逻辑不附);如果出现重复的键(key)后面的键(key)·值(value)对(key-value) 会替换 前面的键(key)·值(value)对(key-value)
  OK,废话了这么多,接下来我来详细且专业的给大家介绍一下字典的各项属性、特点和使用。

  字典另一种可变容器模型,且可存储 任意类型对象
  字典属于一种新的数据结构称为 映射(mapping)
  字典作用列表类似,都是用来存储对象容器
  列表存储数据性能好,但是查询数据性能差,字典正好与之相反
  在字典中每一个元素都有唯一的名字通过这个唯一的名字可以找到指定的元素
  这个 唯一的名字 我们称之为 键(key) 通过key可以快速查询到对应的 value 也可以称之为
  字典我们也称之为 键(key)·值(value)对(key-value) 结构
  每个字典中都 可以有多个 键值对(key-value),而每一个 键值对(key-value) 我们称其为 一项(item)
  字典的每个 键(key)与值(value) 之间用 冒号( : ) 分割 ,每个之间用逗号(,)分割整个字典 包括花括号({}) 中 ,格式如下所示:

d = {key1 : value1, key2 : value2 }

  字典值(value) 可以是 任意对象,字典的 键(key) 可以是 任意的不可变对象(int str bool tuple…)
  字典键(key)不能重复 的,如果出现重复后面的键(key)·值(value)对会替换前面的键(key)·值(value)对
  一个简单的字典实例:

dict = {'Alice': '2341', 'Beth': '9102', 'Cecil': '3258'}

  也可如此创建字典:

dict1 = { 'abc': 456 }
dict2 = { 'abc': 123, 98.6: 37 }

  

3.2 字典的使用

  我们根据 增·删·改·查 思路来拆解字典的使用

3.2.1 字典的 查 – 遍历字典

  我们主要可以通过下面 4种方式 对字典进行遍历。
  keys() :该方法返回字典所有的key;返回一个迭代器,可以使用 list() 来转换为列表。

>>> dict = {'Name': 'Jiang', 'Age': 27}
>>> dict.keys()
dict_keys(['Name', 'Age'])
>>> list(dict.keys())             # 转换为列表
['Name', 'Age']
>>> 

  values() :该方法返回 一个序列 ,序列中保存有 字典所有的值;返回一个迭代器,可以使用 list() 来转换为列表。

dict = {'Name': 'Jiang', 'Age': 27, 'Class': 'Read'}

print("字典所有值为 : ", list(dict.values()))
# 字典所有值为 :  ['Jiang', 27, 'Read']

  items() :该方法会返回字典中 所有的项,它返回一个 序列,序列中包含有 双值子序列双值分别是字典中的 键(key)与值(value)

dict = {'Name': 'Jiang', 'Age': 27}

print("Value : %s" % dict.items())
# Value : dict_items([('Name', 'Jiang'), ('Age', 27)])

  访问字典里的;把相应的键放入到方括号中就可以了;如下实例:

dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
 
print ("dict['Name']: ", dict['Name'])
print ("dict['Age']: ", dict['Age'])

# 输出结果:
# dict['Name']:  Runoob
# dict['Age']:  7

  如果用字典里没有的键访问数据,会输出错误如下:

dict = {'Name': 'Runoob', 'Age': 7, 'Class': 'First'}
 
print ("dict['Alice']: ", dict['Alice'])

# 输出结果:
# Traceback (most recent call last):
#   File "test.py", line 5, in <module>
#     print ("dict['Alice']: ", dict['Alice'])
# KeyError: 'Alice'

3.2.2 字典的 增 和 改

  向字典 添加 新内容的方法是 增加新的键/值对修改 已有键/值对 如下实例:

dict = {'Name': 'CSDN', 'Age': 7, 'Class': 'Read'}

print("没修改的 dict: ", dict)
# 没修改的 dict:  {'Name': 'CSDN', 'Age': 7, 'Class': 'Read'}

print("没修改的 dict['Age']: ", dict['Age'])
# 没修改的 dict['Age']:  7

dict['Age'] = 8  # 更新 Age
dict['Blog'] = "云山·若水的博客"  # 添加信息

print("修改后的 dict: ", dict)
# 修改后的 dict:  {'Name': 'CSDN', 'Age': 8, 'Class': 'Read', 'Blog': '云山·若水的博客'}

print("修改后的 dict['Age']: ", dict['Age'])
# 修改后的 dict['Age']:  8

print("修改后的 dict['Blog']: ", dict['Blog'])
# 修改后的 dict['Blog']:  云山·若水的博客

3.2.3 字典的 删

  删除字典元素 能删单一的元素能清空字典,清空只需一项操作。显示删除一个字典用 del 命令,如下实例:

dict = {'Name': 'CSDN', 'Age': 7, 'Class': 'Read'}
print("没修改的 dict[]: ", dict)
# 还没修改的 dict[]:  {'Name': 'CSDN', 'Age': 7, 'Class': 'Read'}

del dict['Name'] 		# 删除键 'Name'
print("修改后的 dict[]: ", dict)
# 修改的后的 dict[]:  {'Age': 7, 'Class': 'Read'}

dict.clear()     # 清空字典
del dict         # 删除字典
 
print ("修改后的 dict['Age']: ", dict['Age'])
print ("修改后的 dict['School']: ", dict['School'])
# Traceback (most recent call last):
#   File "test.py", line 9, in <module>
#     print ("dict['Age']: ", dict['Age'])
# TypeError: 'type' object is not subscriptable

3.2.4 字典键的特性

  字典值可以是任何的 Python 对象,既可以是标准的对象,也可以是用户自定义的但键不行

  而且,下面的 两个重要的点 需要记住:

  1) 不允许 同一个键出现两次。这个注意点在开篇时就着重的多次提到过。创建时如果出现重复的键(key)后面的键(key)·值(value)对(key-value) 会替换 前面的键(key)·值(value)对(key-value)。如下实例:

dict = {'Name': 'CSDN', 'Age': 7, 'Class': 'Read', 'Name': '小菜鸟'}
 
print ("dict['Name']: ", dict['Name'])
# dict['Name']:  小菜鸟

  2) 键必须不可变!!!所以可以用 数字字符串元组 充当,但用列表就不行。如下实例:

dict = {['Name']: 'CSDN', 'Age': 7, 'Class': 'Read'}
 
print ("dict['Name']: ", dict['Name'])
# 输出结果:
# Traceback (most recent call last):
#   File "test.py", line 3, in <module>
#     dict = {['Name']: 'Runoob', 'Age': 7}
# TypeError: unhashable type: 'list'

3.2.5 字典的内置函数&方法

  Python字典包含了以下内置函数:
在这里插入图片描述

  Python字典包含了以下内置方法:

   1) radiansdict.clear() :删除字典 内所有元素

dict = {'Name': 'CSDN', 'Age': 7, 'Class': 'Read'}
print ("字典长度 : %d" %len(dict))
# 字典长度 : 3

dict.clear()
print ("字典删除后长度 : %d" %len(dict))
# 字典删除后长度 : 0

  2) radiansdict.copy() :返回一个字典的 浅复制

dict1 = {'user': 'Jiang', 'num': [1, 2, 3]}

dict2 = dict1  # 浅拷贝: 引用对象
dict3 = dict1.copy()  # 浅拷贝:深拷贝父对象(一级目录),子对象(二级目录)不拷贝,还是引用

# 修改 data 数据
dict1['user'] = 'root'
dict1['num'].remove(1)

# 输出结果
print(dict1,id(dict1))
# {'user': 'root', 'num': [2, 3]} 2071738592064
print(dict2,id(dict2))
# {'user': 'root', 'num': [2, 3]} 2071738592064
print(dict3,id(dict3))
# {'user': 'Jiang', 'num': [2, 3]} 2071738592128

  3) radiansdict.fromkeys(seq[, value]):创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值

seq = ('name', 'age', 'sex')
 
dict = dict.fromkeys(seq)
print ("新的字典为 : %s" %str(dict))
# 新的字典为 : {'age': None,'name': None,'sex': None}

dict = dict.fromkeys(seq, 10)
print ("新的字典为 : %s" %str(dict))
# 新的字典为 : {'age': 10, 'name': 10, 'sex': 10}

  4) radiansdict.get(key, default=None) :返回指定键的值,如果值不在字典中返回default(默认)值

dict = {'Name': 'Jiang', 'Age': 27}

print ("Age 值为 : %s" %dict.get('Age'))
# Age 值为 : 27
print ("Sex 值为 : %s" %dict.get('Sex', "NA"))
# Sex 值为 : NA

  5) key in dict :如果键在字典dict里返回true,否则返回false

dict = {'Name': 'Jiang', 'Age': 27}

# 检测键 Age 是否存在
if 'Age' in dict:
    print("键 Age 存在")
else:
    print("键 Age 不存在")
# 键 Age 存在

# 检测键 Sex 是否存在
if 'Sex' in dict:
    print("键 Sex 存在")
else:
    print("键 Sex 不存在")
# 键 Sex 不存在

# not in
# 检测键 Age 是否存在
if 'Age' not in dict:
    print("键 Age 不存在")
else:
    print("键 Age 存在")
# 键 Age 存在

  6) radiansdict.items() :以 列表返回 可遍历的(键, 值) 元组数组

dict = {'Name': 'Jiang', 'Age': 27}

print("Value : %s" % dict.items())
# Value : dict_items([('Name', 'Jiang'), ('Age', 27)])

  7) radiansdict.keys() :返回一个迭代器,可以使用 list() 来转换为列表

>>> dict = {'Name': 'Jiang', 'Age': 27}
>>> dict.keys()
dict_keys(['Name', 'Age'])
>>> list(dict.keys())             # 转换为列表
['Name', 'Age']
>>> 

  8) radiansdict.setdefault(key, default=None) :和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default

dict = {'Name': 'Jiang', 'Age': 27}

print("Age 键的值为 : %s" % dict.setdefault('Age', None))
# Age 键的值为 : 27

print("Sex 键的值为 : %s" % dict.setdefault('Sex', None))
# Sex 键的值为 : None

print("新字典为:", dict)
# 新字典为: {'Name': 'Jiang', 'Age': 27, 'Sex': None}

  9) radiansdict.update(dict2) :把 字典dict2 的 键/值对 更新到 dict 里。

dict = {'Name': 'Jiang', 'Age': 27}
dict2 = {'Class': 'Read'}
dict.update(dict2)

print("更新字典 dict : ", dict)
# 更新字典 dict :  {'Name': 'Jiang', 'Age': 27, 'Class': 'Read'}

  10) radiansdict.values() :返回一个迭代器,可以使用 list() 来转换为列表

dict = {'Name': 'Jiang', 'Age': 27, 'Class': 'Read'}

print("字典所有值为 : ", list(dict.values()))
# 字典所有值为 :  ['Jiang', 27, 'Read']

  11) pop(key[,default]) :删除字典给定键 key 所对应的值返回值为被删除的值key值必须给出。 否则,返回 default值。

site= {'name': 'CSDN', 'alexa': 10000, 'url': 'https://www.csdn.net'}
pop_obj=site.pop('name')

print(pop_obj)
# CSDN

  12) popitem() :删除并返回字典中的最后一对键(key) 和 值(value

site= {'name': 'CSDN', 'alexa': 10000, 'url': 'https://www.csdn.net'}
pop_obj=site.popitem()

print(pop_obj)
# ('url', 'https://www.csdn.net')

print(site)
# {'name': 'CSDN', 'alexa': 10000}

  

4. 集合

4.1 集合简介

  集合表现形式:set 集合;和 列表 非常相似。

  不同点:
  1) 集合 只能存储 不可变对象;
  2) 集合中存储的对象无序 的;
  3) 集合 不能出现 重复元素

  使用大括号 { } 来创建集合
  可以通过 set() 函数创建集合,或者将序列字典 转换成 集合

  注意:创建一个 空集合 必须用 set() ,而不是 { }。因为 { } 是用来创建一个 空字典 的。

parame = {value01,value02,...}

# 或者

set(value)

  参考实例:

>>>basket = {'apple', 'orange', 'apple', 'pear', 'orange', 'banana'}
>>> print(basket)                      # 这里演示的是去重功能
{'orange', 'banana', 'pear', 'apple'}
>>> 'orange' in basket                 # 快速判断元素是否在集合内
True
>>> 'crabgrass' in basket
False
 
>>> # 下面展示两个集合间的运算.
...
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a                                  
{'a', 'r', 'b', 'c', 'd'}
>>> a - b                              # 集合a中包含而集合b中不包含的元素
{'r', 'd', 'b'}
>>> a | b                              # 集合a或b中包含的所有元素
{'a', 'c', 'r', 'd', 'b', 'm', 'z', 'l'}
>>> a & b                              # 集合a和b中都包含了的元素
{'a', 'c'}
>>> a ^ b                              # 不同时包含于a和b的元素
{'r', 'd', 'b', 'm', 'z', 'l'}

  类似列表推导式,同样集合支持集合推导式(Set comprehension):

>>>a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}

4.2 集合的基本操作

  我们根据 增·删·改·查 思路来拆解字典的使用

4.2.1 集合的查

  使用 len() 来获取集合中元素的数量。语法格式如下:

len(s)

  计算集合 s 元素个数。

thisset = set(("CSDN", "Google", "Taobao", "Facebook"))

print(len(thisset))
# 4

  判断元素 是否在集合中 存在。语法格式如下:

x in s

  判断元素 x 是否在集合 s 中,存在返回 True,不存在返回 False。

thisset = set(("CSDN", "Google", "Taobao", "Facebook"))

print("Runoob" in thisset)
# False

print("Facebook" in thisset)
# True

print("Runoob" not in thisset)
# True

print("Facebook" not in thisset)
# False

4.2.2 集合的增 · 向集合里添加元素

  add() 向集合中 添加元素。语法格式如下:

s.add( x )

  将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。

thisset = set(("CSDN", "Google", "Taobao"))

thisset.add("Facebook")
print(thisset)
# {'Taobao', 'Facebook', 'Google', 'CSDN'}

  也可以添加元素,update() 将一个集合中的元素添加到另一个集合当中且参数可以是列表,元组,字典等。语法格式如下:

s.update( x )

  x 可以有多个,用逗号分开。

thisset = set(("CSDN", "Google", "Taobao", "Facebook"))

thisset.update({1,3})
print(thisset)
# {1, 3, 'Facebook', 'CSDN', 'Google', 'Taobao'}

thisset.update([1,4],[5,6])
print(thisset)
# {1, 3, 4, 5, 6, 'CSDN', 'Google', 'Taobao', 'Facebook'}

4.2.3 集合的删 · 移除元素

  remove() 删除集合中指定的元素,语法格式如下:

s.remove( x )

  将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误。

thisset = set(("CSDN", "Google", "Taobao"))

thisset.remove("Taobao")
print(thisset)
# {'Google', 'CSDN'}

thisset.remove("Facebook")   				# 不存在会发生错误

# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# KeyError: 'Facebook'

  此外还有一个方法也是移除集合中的元素,且如果元素不存在,不会发生错误。格式如下所示:

s.discard( x )

  参考实例:

thisset = set(("Google", "CSDN", "Taobao"))

thisset.discard("Facebook")  # 不存在不会发生错误
print(thisset)
# {'Google', 'CSDN', 'Taobao'}

  pop() 随机删除集合中的一个元素一般是删除最后一个元素。语法格式如下:

s.pop() 

  参考实例:

thisset = set(("Google", "Runoob", "Taobao", "Facebook"))

x = thisset.pop()
print(x)
# Google

  clear() 清空集合,语法如下:

s.clear()

  参考案例:清空集合 s。

thisset = set(("CSDN", "Google", "Taobao", "Facebook"))

thisset.clear()
print(thisset)
# set()

4.2.4 集合内置方法完整列表

  len() 来获取集合中元素的数量。

thisset = set(("CSDN", "Google", "Taobao", "Facebook"))

print(len(thisset))
# 4

  add() 向集合中添加元素。

thisset = set(("CSDN", "Google", "Taobao"))

thisset.add("Facebook")
print(thisset)
# {'Taobao', 'Facebook', 'Google', 'CSDN'}

  in / not in 判断 元素是否在集合中存在。

thisset = set(("CSDN", "Google", "Taobao", "Facebook"))

print("Runoob" in thisset)
# False

print("Facebook" in thisset)
# True

print("Runoob" not in thisset)
# True

print("Facebook" not in thisset)
# False

  update() 将一个集合中的元素添加到另一个集合当中且参数可以是列表,元组,字典等。

thisset = set(("CSDN", "Google", "Taobao", "Facebook"))

thisset.update({1,3})
print(thisset)
# {1, 3, 'Facebook', 'CSDN', 'Google', 'Taobao'}

thisset.update([1,4],[5,6])
print(thisset)
# {1, 3, 4, 5, 6, 'CSDN', 'Google', 'Taobao', 'Facebook'}

  remove() 删除集合中指定的元素。

thisset = set(("CSDN", "Google", "Taobao"))

thisset.remove("Taobao")
print(thisset)
# {'Google', 'CSDN'}

thisset.remove("Facebook")   				# 不存在会发生错误

# Traceback (most recent call last):
#   File "<stdin>", line 1, in <module>
# KeyError: 'Facebook'

  discard( x ) 移除集合中的元素,且如果元素不存在,不会发生错误。

thisset = set(("Google", "CSDN", "Taobao"))

thisset.discard("Facebook")  		# 不存在不会发生错误
print(thisset)
# {'Taobao', 'Google', 'CSDN'}

  pop() 随机删除集合中的一个元素一般是删除最后一个元素。

thisset = set(("Google", "Runoob", "Taobao", "Facebook"))

x = thisset.pop()
print(x)
# Google

  clear() 清空集合。

thisset = set(("CSDN", "Google", "Taobao", "Facebook"))

thisset.clear()
print(thisset)
# set()

  除了以上这些之前在文章中出现过的内置方法外, Python语言 的集合还有以下这些内置方法:

  copy() 拷贝一个集合

fruits = {"apple", "banana", "cherry"}
x = fruits.copy()

print(fruits,id(fruits))
# {'banana', 'cherry', 'apple'} 1796909613792
print(x,id(x))
# {'banana', 'cherry', 'apple'} 1796909613568

x.add("CSDN")

print(fruits,id(fruits))
# {'banana', 'cherry', 'apple'} 1796909613792

print(x,id(x))
# {'CSDN', 'banana', 'cherry', 'apple'} 1796909613568

  difference() 返回多个集合的差集

# 返回一个集合,元素包含在集合 x ,但不在集合 y :

x = {"apple", "banana", "cherry"}
y = {"google", "microsoft", "apple"}
 
z = x.difference(y) 
 
print(z)
# {'cherry', 'banana'}

  difference_update() 移除集合中的元素,该元素在指定的集合也存在。

# 返回一个移除的集合,元素包含在集合 x ,但不在集合 y :

x = {"apple", "banana", "cherry"}
y = {"google", "microsoft", "apple"}
 
x.difference_update(y) 
 
print(x)
# {'banana', 'cherry'}

  intersection() 返回集合的交集

# 返回一个新集合,该集合的元素既包含在集合 x 又包含在集合 y 中:
x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
 
z = x.intersection(y) 
 
print(z)
# {'apple'}

  intersection_update() 返回集合的交集。

# 返回一个新集合,该集合的元素既包含在集合 x 又包含在集合 y 中:

x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
 
x.intersection_update(y) 
 
print(x)
# {'apple'}

  isdisjoint() 判断两个集合是否包含相同的元素,如果没有返回 True,否则返回 False。

# 判断集合 y 中是否有包含 集合 x 的元素:

x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "facebook"}
 
z = x.isdisjoint(y) 
 
print(z)
# True

#-----------------------------------------------------------------

# 如果包含返回 False:

x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
 
z = x.isdisjoint(y) 
 
print(z)
# False

  issubset() 判断指定集合是否为该方法参数集合的子集。

x = {"a", "b", "c"}
y = {"f", "e", "d", "c", "b", "a"}
 
z = x.issubset(y) 
 
print(z)
# True

#-----------------------------------------------------------------

# 如果没有全部包含返回 False:
x = {"a", "b", "c"}
y = {"f", "e", "d", "c", "b"}
 
z = x.issubset(y) 
 
print(z)
# False

  issuperset() 判断该方法的参数集合是否为指定集合的子集

# 判断集合 y 的所有元素是否都包含在集合 x 中:

x = {"f", "e", "d", "c", "b", "a"}
y = {"a", "b", "c"}
 
z = x.issuperset(y) 
 
print(z)
# True

#-----------------------------------------------------------------

# 如果没有全部包含返回 False:

x = {"f", "e", "d", "c", "b"}
y = {"a", "b", "c"}
 
z = x.issuperset(y) 
 
print(z)
# False

  symmetric_difference() 返回两个集合中不重复的元素集合。

# 返回两个集合组成的新集合,但会移除两个集合的重复元素:

x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
 
z = x.symmetric_difference(y) 
 
print(z)
# {'google', 'cherry', 'banana', 'runoob'}

  symmetric_difference_update() 移除当前集合中在另外一个指定集合相同的元素,并将另外一个指定集合中不同的元素插入到当前集合中。

# 在原始集合 x 中移除与 y 集合中的重复元素,并将不重复的元素插入到集合 x 中:

x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
 
x.symmetric_difference_update(y) 
 
print(x)
# {'google', 'cherry', 'banana', 'runoob'}

  union() 返回两个集合的并集

# 合并两个集合,重复元素只会出现一次:

x = {"apple", "banana", "cherry"}
y = {"google", "runoob", "apple"}
 
z = x.union(y) 
 
print(z)
# {'cherry', 'runoob', 'google', 'banana', 'apple'}

#-----------------------------------------------------------------

# 合并多个集合:

x = {"a", "b", "c"}
y = {"f", "d", "a"}
z = {"c", "d", "e"}
 
result = x.union(y, z) 
 
print(result)
# {'c', 'd', 'f', 'e', 'b', 'a'}

  

4.3 集合的运算

   & 交集运算

s1 = {1,2,3,4,5,6}
s2 = {3,4,5,6,7,8}

result = s1 & s2
print(s1,s2,result)
# {1, 2, 3, 4, 5, 6} {3, 4, 5, 6, 7, 8} {3, 4, 5, 6}

   | 并集运算

s1 = {1,2,3,4,5,6}
s2 = {3,4,5,6,7,8}

result = s1 | s2
print(result)
# {1, 2, 3, 4, 5, 6, 7, 8}

   - 差集运算

s1 = {1,2,3,4,5,6}
s2 = {3,4,5,6,7,8}
-
result = s1 - s2
print(result)
# {1, 2}

   ^ 亦或集

# 两个集合不相交的部分

s1 = {1,2,3,4,5,6}
s2 = {3,4,5,6,7,8}

result = s1 ^ s2
print(result)
# {1, 2, 7, 8}

   <= 检查一个集合是否是另一个集合的子集
   < 检查一个集合是否是另一个集合的真子集

a = {1,2,3}
b = {1,2,3,4,5,6}

result = a < b    # a集合是b集合的子集
print(result)
# True

result = a <= b   # b集合是a集合的超集
print(result)
# True

   >=检查一个集合是否是另一个集合的超集
   >检查一个集合是否是另一个集合的真超集

a = {1,2,3}
b = {1,2,3,4,5,6}

result = a > b    # a集合是b集合的子集
print(result)
# False

result = a >= b   # b集合是a集合的超集
print(result)
# False

  

总结小便条

本篇文章主要讲了以下几点内容:

  1. 元组 的表现形式是 tuple。
    1.1 Python的 元组 与 列表 类似,不同之处在于元组的元素不能修改。所以 元组是一个不可变序列(一般当我们希望数据不改变时,我们使用元组,其他情况下基本都用列表)
    1.2 元组 增·删·改·查 的操作以及Python语言自带的内置方法 这个只能靠自己 多看、多写、多体会 了。

  2. Python中 数值类型(int和float)、字符串str、元组tuple 都是 不可变类型 ;而 列表list、字典dict、集合set 是 可变类型
    2.1 可变对象中都保存了三个数据:
      id(标识)  type(类型)  value(值)
      在这里,我们说的可变变量指的是我们可以对对象里面的 value 进行改变。
    2.2 对 可变对象 的四种操作方法 这个只能靠自己 多看、多写、多体会 了。

  3. 字典 就是 键(key)·值(value)对(key-value)
    3.1 字典的语法表现形式: d = {key1 : value1, key2 : value2 }
    3.2 字典 增·删·改·查 的操作以及Python语言自带的内置方法 这个只能靠自己 多看、多写、多体会 了。

  4. 集合表现形式:set 集合;和 列表 非常相似。
    4.1 它与 列表 不同点:
      1) 集合 只能存储 不可变对象;
      2) 集合中存储的对象是 无序 的;
      3) 集合 不能出现 重复元素。
    4.2 使用大括号 { } 来创建集合;可以通过 set() 函数创建集合,或者将序列和字典 转换成 集合。
    注意:创建一个 空集合 必须用 set() ,而不是 { }。因为 { } 是用来创建一个 空字典 的。
    4.3 集合 增·删·改·查 的操作以及Python语言自带的内置方法 这个只能靠自己 多看、多写、多体会 了。

 本章回顾暂时就到这了,如果还有点晕,那就去完成作业吧。拜拜~

  
    
  

作业

  1. 上文中讲到的函数以及代码再练习几遍;
  2. 从 a = {“name”:“123”,“data”:{“result”:[{“src”:“python1”},{“src”:“python2”},{“src”:“python3”}]}}  找到  python1/python2/python3
  3. 有如下集合{11, 22, 33, 44, 55, 66, 77, 88, 99},将所有 大于66的值 保存至字典的第一个key中,将所有 小于66的值 保存至字典的第二个key中;
  4. 将字符串中的空格替换成“%20”

  
  
  

参考答案

# 作业 2
a = {"name":"qwe","data":{"result":[{"src":"python1"},{"src":"python2"},{"src":"python3"}]}}

# 提取 python1 , python2 , python3

# data ---> {"result":[{"src":"python1"},{"src":"python2"},{"src":"python3"}]}
# result ---> [{"src":"python1"},{"src":"python2"},{"src":"python3"}]

# 方法 1

b = a['data']
c = b['result']

for i in c:
    print(i['src'])
# python1
# python2
# python3

# 方法 2

b = a['data']['result']

for x in b:
    print(x['src'])
# python1
# python2
# python3

#-----------------------------------------------------------------------------------

# 作业 3			# 原理我懂,但最初我就是没有有做出想要的结果。为什么呢。因为我忘记了  append 和 update  这两个内置函数。

i = {11, 22, 33, 44, 55, 66, 77, 88, 99}

dic = {}
m = []
n = []

for x in i:
    if x > 66:
        m.append(x)
    else:
        n.append(x)

dic.update(k1 = m, k2 = n)
print(dic)

#-----------------------------------------------------------------------------------

# 作业 4

# 将字符串中的空格替换成“%20”

# 方法一:
strs = 'hello my baby'

def rep(a):
    li = []
    for i in a:
        li.append(i)
    for i in range(len(li)):
        if li[i] == ' ':
            li[i] = '%20'
    return ''.join(li)

sa = rep(strs)
print(sa)


# 方法二:
def rep(a):
    li = []
    for i in a:
        li.append(i)
    for i in li:
        if i == ' ':
            li[li.index(i)] = '%20'
    return ''.join(li)
sb = rep(strs)
print(sb)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章