Python中级之数据类型的内置方法3(元祖、布尔、集合)

【一】元祖类型(tuple)

【1】定义

  • 元祖类型是有序且不可变的数据类型,通常使用小括号定义(也可以使用逗号)
#用逗号定义
num_tuple = 1, 2, 3, 4, 5
#用小括号定义
num_tuple = (1, 2, 3, 4, 5)

【2】内置方法

(1)类型强转

#使用tuple()函数将其他数据类型转换为元组类型
num_list = [1, 2, 3, 4, 5]
print(tuple(num_list))
#输出 (1, 2, 3, 4, 5)

(2)索引取值

  • 元祖也可以按索引取值

[1]正索引取值

num_tuple = (1, 2, 3, 4, 5)
print(num_tuple[1])
#输出 2

[2]负索引取值

num_tuple = (1, 2, 3, 4, 5)
print(num_tuple[-1])
#输出 5

[3]只能取不能改

#与列表相同,如果索引不存在,会抛出IndexError  
num_tuple = (1, 2, 3, 4, 5)
print(num_tuple[6])
'''
Traceback (most recent call last):
  File "D:\Python\pythonProject\pythonProject1\dmeo2.py", line 328, in <module>
    print(num_tuple[6])
IndexError: tuple index out of range
'''

(3)切片

#顾头不顾尾
num_tuple = (1, 2, 3, 4, 5)
print(num_tuple[0:3])
#输出 (1, 2, 3)

#步长
num_tuple = (1, 2, 3, 4, 5)
print(num_tuple[0:5:2])
#输出 (1, 3, 5)

(4)计算长度

#使用len()函数可以获取元组的长度
num_tuple = (1, 2, 3, 4, 5)
print(len(num_tuple))
#输出 5

(5)成员运算

#与列表相同,元组也支持in和not in运算符
num_tuple = (1, 2, 3, 4, 5)
print('2' in num_tuple) #输出 False
print('8' not in num_tuple)  #输出 True

(6)遍历循环

#使用for循环可以遍历元组中的每个元素
num_tuple = (1, 2, 3, 4, 5)
for num in num_tuple:
    print(num)
#输出 1 2 3 4 5

(7)元祖拼接

#使用+运算符可以将两个元组拼接成一个新的元组
num_tuple = (1, 2, 3, 4, 5)
num_tuple_add = (6, 7, 8)
print(num_tuple + num_tuple_add)
#输出 (1, 2, 3, 4, 5, 6, 7, 8)

(8)元祖重复

#使用*运算符可以将元组重复指定次数
num_tuple = (1, 2, 3, 4, 5)
repeated_tuple = num_tuple * 2
print(repeated_tuple)
#输出 (1, 2, 3, 4, 5, 1, 2, 3, 4, 5)

【二】布尔类型(bool)

【1】强制类型转换

  • 为真的情况转为True,为假的情况转为False
#布尔值为True为真
#非零数字(整数或浮点数)都为真
num1 = 1  
num2 = 1.5
print(bool(num1), type(bool(num1)))  # True <class 'bool'>
print(bool(num2), type(bool(num2)))  # True <class 'bool'>

#非空字符串为真
name = 'ligo'  
print(bool(name), type(bool(name)))  # True <class 'bool'>

#非空列表、非空字典、非空集合都为真
num_list = [1, 2, 3, 4, 5]
print(bool(num_list),type(num_list)) # True <class 'list'>
#布尔值为False为假
#0为假
num_one = 0  
print(bool(num_one), type(bool(num_one)))  # False <class 'bool'>

#空字符串为假
name = ''  
print(bool(name), type(bool(name)))  # False <class 'bool'>

#空列表、空字典、空集合都为假
num_list = []
print(bool(num_list),type(num_list)) # False <class 'list'>

【三】集合类型(set)

【1】定义

  • 集合是无序且不重复的数据类型,通常用大括号{}来定义,元素之间用逗号分隔
#定义
num_set = {1, 2, 3, 4, 5}
print(num_set) #输出 {1, 2, 3, 4, 5}

#无序性
num_set = {'c', 'a', 'b'}
print(set(num_set))
#输出两次
# {'b', 'c', 'a'}
# {'a', 'c', 'b'}

#去重性
num_set = {1, 2, 3, 4, 5, 3, 3, 3, 5}
print(num_set) #输出 {1, 2, 3, 4, 5}

【2】内置方法

(1)类型强转

  • 能被for循环的遍历的数据类型都能转换成集合类型(遍历出的每一个值都必须为不可变类型)
# 【1】字符串类型转换成集合类型
name = 'ligo'
name_set = set(name)
print(name_set, type(name_set))
# 输出{'g', 'l', 'i', 'o'} <class 'set'>

# 【2】字典一般只对字典的值去重,因为字典的键一般情况下都是唯一的,不需要更改
# (1)默认将字典的键转换为集合
dict = {'username': 'ligo', 'password': '123'}
dict_set = set(dict)
print(dict_set, type(dict_set))
# 输出 {'username', 'password'} <class 'set'>

# (2)将字典的值转换为集合并去重
dict_values = dict.values()
dict_values_set = set(dict_values)
print(dict_values_set, type(dict_values_set))
# {'123', 'ligo'} <class 'set'>

# 【3】列表类型转换成集合类型
num_list = [1, 2, 3, 4, 5]
num_list_set = set(num_list)
print(num_list_set, type(num_list_set))
# {1, 2, 3, 4, 5} <class 'set'>

# 【4】元组类型转换为集合类型
num_tuple = (1, 2, 3, 4, 5)
num_tuple_set = set(num_tuple)
print(num_tuple_set, type(num_tuple_set))
# {1, 2, 3, 4, 5} <class 'set'>

# 【5】布尔类型不可以
print(set(True))
# TypeError: 'bool' object is not iterable

# 【6】整数类型不可以
print(set(1))
# TypeError: 'int' object is not iterable

# 【7】浮点数类型不可以
print(set(3.14))
# TypeError: 'float' object is not iterable

(2)添加元素

[1] 添加单个元素(add())

#add(element)方法用于向集合中添加单个元素
num_set = {1, 2, 3, 4, 5}
num_set.add(6)
print(num_set)
# 输出 {1, 2, 3, 4, 5, 6}

[2]添加多个元素(update())

#update(iterable)方法用于向集合中添加多个元素
num_set = {1, 2, 3, 4, 5}
num_set.update([6, 7, 8])
print(num_set)
# 输出 {1, 2, 3, 4, 5, 6, 7, 8}

(3)删除元素

[1] 删除指定元素(remove())

#remove(element)方法用于删除集合中的指定元素,元素不存在则会报错
num_set = {1, 2, 3, 4, 5}
num_set.remove(1)
print(num_set)  
#输出 {2, 3, 4, 5}

[2] 删除指定元素(discard())

#discard(element)方法用于删除集合中的指定元素,元素不存在则不会引报错
num_set = {1, 2, 3, 4, 5}
num_set.discard(1)
print(num_set)  
#输出 {2, 3, 4, 5}

[3] 随机删除元素(pop())

#pop()方法用于随机删除集合中的一个元素,如果集合为空则会报错
num_set = {1, 2, 3, 4, 5}
num = num_set.pop()
print(num)  # 输出: 1
print(num_set)  # 输出: {2, 3, 4, 5}
  • 当集合中的元素是纯数字时,集合会从小到大排列元素,然后会删除最小的那个元素。
num_set = {1, 2, 3, 4, 5}
num_set.pop()
print(num_set)
#输出 {2, 3, 4, 5}
  • 当集合中的元素是纯字符串时,随机删除一个元素
set = {'a', 'b', 'c', 'd'}
set.pop()
print(set)
# 输出 {'c', 'a', 'b'}
  • 当集合中的元素有字符串、数字、元组等组合时,依旧会随机删除一个元素。
set = {'a', 'b', 'c', 'd', (1, 3), 1, 3}
set.pop()
print(set)
# 输出 {(1, 3), 3, 'c', 'd', 'b', 'a'}
  • 当集合是空的时候会报错
set = {}
# 实际上,这并不是集合,而是字典
print(set, type(set))
# {} <class 'dict'>
set1.pop()
# TypeError: pop expected at least 1 argument, got 0

(4)集合操作

[1] 并集

#union()方法返回当前集合与其他集合的并集
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print(set1.union(set2)) 
# 输出 {1, 2, 3, 4, 5, 6, 7, 8}

[2] 交集

#intersection()方法返回当前集合与其他集合的交集
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print(set1.intersection(set2))  
# 输出 {4, 5}

[3] 差集

#difference()方法返回当前集合与其他集合的差集
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print(set1.difference(set2))  
# 输出 {1, 2, 3}

[4] 对称差集

#symmetric_difference()方法返回当前集合与其他集合的对称差集
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
print(set1.symmetric_difference(set2))  
# 输出 {1, 2, 3, 6, 7, 8}

[5]父集

set1 = {1, 2, 3, 4, 5}
set2 = {1, 5}
# 判断 set1 是否是 set2 的父集
is_superset = set1.issuperset(set2)
print(is_superset)
# 输出: True

[6]子集

set1 = {1, 2, 3, 4, 5}
set2 = {1, 5}
# 判断 set2 是否是 set1 的子集
is_subset = set2.issubset(set1)
print(is_subset)
# 输出: True

[7]判断

set1 = {1, 2, 3, 4, 5}
set2 = {5, 6}
# 判断两个集合是否相等
is_equal = set1 == set2
print(is_equal)
# 输出: False

(5)去重

#如果集合中只有纯数字的单一元素,顺序是不会变的
num_set = {1, 2, 3, 4, 5, 3, 3, 3, 5}
print(num_set) #输出 {1, 2, 3, 4, 5}
#只能针对不可变类型,集合本身是无序的,去重之后无法保留原来的顺序
num_set = {'c', 'a', 'b'}
print(set(num_set))
#输出两次
# {'b', 'c', 'a'}
# {'a', 'c', 'b'}
# 针对不可变类型,并且保证顺序则需要我们自己写代码实现,例如
l_second = [
    {'name': 'lili', 'age': 18, 'sex': 'male'},
    {'name': 'jack', 'age': 73, 'sex': 'male'},
    {'name': 'tom', 'age': 20, 'sex': 'female'},
    {'name': 'lili', 'age': 18, 'sex': 'male'},
    {'name': 'lili', 'age': 18, 'sex': 'male'},
]

new_l_second = []

for dic in l_second:
    if dic not in new_l_second:
        new_l_second.append(dic)

print(new_l_second)
# 结果:既去除了重复,又保证了顺序,而且是针对不可变类型的去重
'''
[
{'name': 'lili', 'age': 18, 'sex': 'male'}, 
{'name': 'jack', 'age': 73, 'sex': 'male'}, 
{'name': 'tom', 'age': 20, 'sex': 'female'}
]
'''

(6)计算长度(len())

#使用len函数计算长度
num_set = {1, 2, 3, 4, 5}
print(len(num_set))
# 输出 5

(7)遍历循环

#使用for循环进行遍历
num_set = {1, 2, 3, 4, 5}
for num in num_set:
    print(num)
# 输出 1 2 3 4 5

(8)成员运算

num_set = {1, 2, 3, 4, 5}
#用in运算符
print(1 in num_set) #输出 True
#用not in运算符
print(6 not in num_set) #输出 True

【四】数据类型总结

按存值个数区分
只能存一个值:可称为标量/原子类型 数字类型、字符串
可以存放多个值:可称为容器类型 列表、元祖、字典
按照访问方式区分
直接访问:只能通过变量名访问整个值 数字类型
顺序访问:可以通过索引访问指定的值,索引代表顺序,又称为序列类型 字符串、列表、元祖
key访问:可以用key访问指定的值,又称为映射类型 字典
按可变不可变区分
可变类型 列表、字典
不可变类型 数字、字符串、元祖
posted @ 2024-05-08 15:30  Ligo6  阅读(58)  评论(0)    收藏  举报