python基础--列表、元组、字典和集合

列表、元组、字典和集合

在 Python 编程中,我们既需要独立的变量来保存一份数据,也需要序列来保存大量数据。

列表(list)和元组(tuple)比较相似,它们都按顺序保存元素,所有的元素占用一块连续的内存,每个元素都有自己的索引,因此列表和元组的元素都可以通过索引(index)来访问。

它们的区别在于:列表是可以修改的,而元组是不可修改的。

字典(dict)和集合(set)存储的数据都是无序的,每份元素占用不同的内存,其中字典元素以 key-value 的形式保存。

1、序列:

序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。

序列类型包括字符串、列表、元组、集合和字典,这些序列支持以下几种通用的操作,但比较特殊的是,集合和字典不支持索引、切片、相加和相乘操作。

序列切片:

切片操作是访问序列中元素的另一种方法,它可以访问一定范围内的元素,通过切片操作,可以生成一个新的序列。

语法格式:

strname[start : end : step]
  • strname:表示序列的名称;
  • start:表示切片的开始索引位置(包括该位置),此参数也可以不指定,会默认为 0,也就是从序列的开头进行切片;
  • end:表示切片的结束索引位置(不包括该位置),如果不指定,则默认为序列的长度;
  • step:表示在切片过程中,隔几个存储位置(包含当前位置)取一次元素,也就是说,如果 step 的值大于 1,则在进行切片去序列元素时,会“跳跃式”的取元素。
str = "中国惊奇先生,狐妖小红娘"
print(str[:2])   # 中国
print(str[1:7])   # 国惊奇先生,
print(str[3:])    # 奇先生,狐妖小红娘
print(str[::2])   # 中惊先,妖红
print(str[:])   # 中国惊奇先生,狐妖小红娘
序列相加:

Python 中,支持两种类型相同的序列使用“+”运算符做相加操作,它会将两个序列进行连接,但不会去除重复的元素。

str02 = "神墓"
print("画江湖之不良人," + "万妖谱," + str02)   # 画江湖之不良人,万妖谱,神墓
序列相乘:

Python 中,使用数字 n 乘以一个序列会生成新的序列,其内容为原来序列被重复 n 次的结果。

str03 = "hello"
print(str03 * 5)   # hellohellohellohellohello
检查元素是否包含在序列中:

Python 中,可以使用 in 关键字检查某元素是否为序列的成员。

str04 = 'h'
print(str04 in "hello world!")   # true

not in 关键字,它用来检查某个元素是否不包含在指定的序列中。

和序列相关的内置函数:
函数功能
len()计算序列的长度,即返回序列中包含多少个元素。
max()找出序列中的最大元素。注意,对序列使用 sum() 函数时,做加和操作的必须都是数字,不能是字符或字符串,否则该函数将抛出异常,因为解释器无法判定是要做连接操作(+ 运算符可以连接两个序列),还是做加和操作。
min()找出序列中的最小元素。
list()将序列转换为列表。
str()将序列转换为字符串。
sum()计算元素和。
sorted()对元素进行排序。
reversed()反向序列中的元素。
enumerate()将序列组合为一个索引序列,多用在 for 循环中。
str05 = "hello,world"
print(max(str05))   # w
print(min(str05))   # ,
print(sorted(str05))   # [',', 'd', 'e', 'h', 'l', 'l', 'l', 'o', 'o', 'r', 'w']

2、列表操作:

1、什么是列表?

  • 需求:经常需要将一组(不只一个)数据存储起来,以便后边的代码使用。

  • 数组(Array),它就可以把多个数据挨个存储到一起,通过数组下标可以访问数组中的每个元素。

  • Python 中没有数组,但是加入了更加强大的列表。如果把数组看做是一个集装箱,那么 Python 的列表就是一个工厂的仓库。

**列表 **会将所有元素都放在一对中括号[ ]里面,相邻元素之间用逗号,分隔。

lst = [1,2,3,4,5]

**列表 **中的元素,个数没有限制,只要是 Python 支持的数据类型就可以。

列表 可以存储整数小数字符串列表元组等任何类型的数据,并且同一个列表中元素的类型也可以不同。

["xiaoche", 1, [2,3,4] , 3.0, (5,6,7)]

注意:一般列表中只放入同一类型的数据,这样可以提高程序的可读性。

2、创建列表:

  • 使用 [ ] 直接创建:
listname = [element1 , element2 , element3 , ... , elementn]
# 例如:
num = [1, 2, 3, 4, 5, 6, 7]
name = ["Jack", "tom"]
program = ["php", "Python", "Java"]

# 也可以是个空列表:
lst = []
  • 使用list()函数创建:
# 将字符串转换成列表
list1 = list("hello")
print(list1)

# 将元组转换成列表
tuple1 = ('Python', 'Java', 'C++', 'JavaScript')
list2 = list(tuple1)
print(list2)

# 将字典转换成列表
dict1 = {'a':100, 'b':42, 'c':9}
list3 = list(dict1)
print(list3)

# 将区间转换成列表
range1 = range(1, 6)
list4 = list(range1)
print(list4)

# 创建空列表
print(list())

3、访问列表元素

  • 使用索引(Index)访问列表中的某个元素(得到的是一个元素的值)。
  • 使用切片访问列表中的一组元素(得到的是一个新的子列表)。
lst = [10,20,30,40,45]
print(lst)     # [10, 20, 30, 40, 45]
print(lst[3])   # 40
print(lst[2:])    # [30, 40, 45]

4、删除列表:

对于已经创建的列表,如果不再使用,可以使用del关键字将其删除。

  • 但是在实际开发中,并不经常用del来删除列表。

  • Python 自带的垃圾回收机制会自动销毁无用的列表,即使开发者不手动删除,Python 也会自动将其回收。

del lst    # 删除列表
print(lst)

删除列表之后,在打印列表会报错,如下图:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1fv4yekq-1678548787538)(assets/image-20230301222645223.png)]

5、列表添加元素:

实际开发中,经常需要对 Python 列表进行更新,包括向列表中添加元素、修改表中元素以及删除元素。

1)使用+运算符可以将多个序列连接起来;
name_list = ["jack","tom","andy","lihua"]
age_list = [21,19,32,43]
print(name_list + age_list)   # ['jack', 'tom', 'andy', 'lihua', 21, 19, 32, 43]

从上面,我们不难看出,使用+会生成一个新的列表,原有的列表不会被改变。

2)append()方法添加元素

append() 方法用于在列表的末尾追加元素。

lst = ['java','python','linux']
lst.append("php")
print(lst)   # ['java', 'python', 'linux', 'php']

lst.append((1,2,3))
print(lst)  # ['java', 'python', 'linux', 'php', (1, 2, 3)]

lst.append(["apple","banana"])
print(lst)  # ['java', 'python', 'linux', 'php', (1, 2, 3), ['apple', 'banana']]

从上面可以看出,当给 append() 方法传递列表或者元组时,此方法会将它们视为一个整体,作为一个元素添加到列表中,从而形成包含列表和元组的新列表。

3)extend()方法添加元素

extend()append() 的不同之处在于:extend() 不会把列表或者元祖视为一个整体,而是把它们包含的元素逐个添加到列表中。

item = ['java','python','linux']
item.extend('C')
print(item)  # ['java', 'python', 'linux', 'C']

t = (1,2,3)
item.extend(t)
print(item)   # ['java', 'python', 'linux', 'C', 1, 2, 3]

item.extend(['Vue','html'])
print(item)   # ['java', 'python', 'linux', 'C', 1, 2, 3, 'Vue', 'html']
4)insert()方法插入元素

append()extend() 方法只能在列表末尾插入元素,如果希望在列表中间某个位置插入元素,那么可以使用 insert() 方法

当插入列表或者元祖时,insert() 也会将它们视为一个整体,作为一个元素插入到列表中,这一点和 append() 是一样的。

lst = ['Python', 'C++', 'Java']
lst.insert(1, 'linux')
print(lst)  # ['Python', 'linux', 'C++', 'Java']

t = (1,2)
lst.insert(2,t)
print(lst)   # ['Python', 'linux', (1, 2), 'C++', 'Java']

lst.insert(1,['js','html'])
print(lst)   # ['Python', ['js', 'html'], 'linux', (1, 2), 'C++', 'Java']

lst.insert(0,"hello")
print(lst)   # ['hello', 'Python', ['js', 'html'], 'linux', (1, 2), 'C++', 'Java']

注意:insert() 主要用来在列表的中间位置插入元素,如果你仅仅希望在列表的末尾追加元素,那我更建议使用 append() 和 extend()。

6、列表删除元素:

Python 列表中删除元素主要分为以下 3 种场景:

  • 根据目标元素所在位置的索引进行删除,可以使用 del 关键字或者 pop() 方法
  • 根据元素本身的进行删除,可使用列表(list类型)提供的 remove() 方法
  • 将列表中所有元素全部删除,可使用列表(list类型)提供的 clear() 方法
1)del:根据索引值删除元素

del 不仅可以删除整个列表,还可以删除列表中的某些元素。

  • del 可以删除单个元素,也可以删除一段连续的元素。
lst = ['java','python','php','html','linux','C++','Vue']
del lst[3]
print(lst)   # ['java', 'python', 'php', 'linux', 'C++', 'Vue']

del lst[-1]
print(lst)  # ['java', 'python', 'php', 'linux', 'C++']

lst02 = ['java','python','php','html','linux','C++','Vue']
del lst02[2:5]
print(lst02)  # ['java', 'python', 'C++', 'Vue']

lst03 = ['java','python','php','html','linux','C++','Vue']
del lst03[-4:-1]
print(lst03)   # ['java', 'python', 'php', 'Vue']

注意:使用切片删除时左闭右开的。

2) pop():根据索引值删除元素

pop() 方法用来删除列表中指定索引处的元素:listname.pop(index)

  • 如果不写 index 参数,默认会删除列表中的最后一个元素,类似于数据结构中的“出栈”操作。
lst04 = ['apple','banana', 'watermelon', 'orange']
lst04.pop(2)
print(lst04)  # ['apple', 'banana', 'orange']

lst04.pop()
print(lst04)   # ['apple', 'banana']
3)remove():根据元素值进行删除

remove() 方法,会根据元素本身的值来进行删除操作。

  • remove() 方法只会删除第一个和指定值相同的元素,而且必须保证该元素是存在的,否则会引发 ValueError 错误
num = [23,67,98,342,21,43,23]
num.remove(67)
print(num)  # [23, 98, 342, 21, 43, 23]

num.remove(23)
print(num)  # [98, 342, 21, 43, 23]

num.remove(23)
print(num)   # [98, 342, 21, 43]

num.remove(12)
print(num)  # ValueError: list.remove(x): x not in list
4) clear():删除列表所有元素

clear() 用来删除列表的所有元素,也即清空列表。

num = [23,67,98,342,43]
num.clear()
print(num)

7、列表修改元素:

1) 修改单个元素

修改单个元素非常简单,直接对元素赋值即可。

num = [23,54,76,98,12]
num[2] = 100
print(num)   # [23, 54, 100, 98, 12]

num[-1] = -190
print(num)   # [23, 54, 100, 98, -190]
2) 修改一组元素

Python 支持通过切片语法给一组元素赋值。

num = [40,23,54,76,33]
num[1:3] = [1,2,3,4]
print(num)   # [40, 1, 2, 3, 4, 76, 33]

num = [1,2,3,4,5,6]
num[1:4] = [10,20]
print(num)   # [1, 10, 20, 5, 6]
  • 如果不指定步长(step 参数),Python 就不要求新赋值的元素个数与原来的元素个数相同;
  • 这意味,该操作既可以为列表添加元素,也可以为列表删除元素。
  • 如果对空切片(slice)赋值,就相当于插入一组新的元素。
num = [10,20,30,40,50]
num[3:3] = [100,200,300]
print(num)  # [10, 20, 30, 100, 200, 300, 40, 50]

注意:使用切片语法赋值时,Python 不支持单个值。

使用切片语法时也可以指定步长(step 参数),但这个时候就要求所赋值的新元素的个数与原有元素的个数相同

8、列表查找元素:

Python 列表(list)提供了 index()count() 方法,它们都可以用来查找元素

1)index() 方法用来查找某个元素在列表中出现的位置(也就是索引)。
  • 如果该元素不存在,则会导致 ValueError 错误,所以在查找之前最好使用 count() 方法判断一下。

语法格式: listname.index(obj, start, end)

num = [12,54,21,65,342,21]
#检索列表中的所有元素
print(num.index(21))  # 2
#检索1~5之间的元素
print(num.index(65,1,5))  # 3
#检索2之后的元素
print(num.index(342,2))  # 4
#检索一个不存在的元素
print(num.index(100))  # ValueError: 100 is not in list
2) count() 方法用来统计某个元素在列表中出现的次数
  • 如果 count() 返回 0,就表示列表中不存在该元素,所以 count() 也可以用来判断列表中的某个元素是否存在。
num = [1,2,3,4,5,2,2,3,4]
print("2在列表中共出现了%d次" %num.count(2))  # 2在列表中共出现了3次
if num.count(100):
    print("列表中有100")
else:
    print("列表中没有100")

3、元组操作:

元组(tuple)是 Python 中另一个重要的序列结构,和列表类似,元组也是由一系列按特定顺序排序的元素组成。

元组和列表(list)的不同之处在于:

  • 列表的元素是可以更改的,包括修改元素值,删除和插入元素,所以列表是可变序列;
  • 而元组一旦被创建,它的元素就不可更改了,所以元组是不可变序列。
  • 元组的所有元素都放在一对小括号( )中,相邻元素之间用逗号,分隔。
  • 元组可以存储整数、实数、字符串、列表、元组等任何类型的数据,并且在同一个元组中,元素的类型可以不同。但是不推荐这样。
  • 元组是 tuple 类型。

1)创建元组:

通过( )创建元组后,一般使用=将它赋值给某个变量。

t = (1,2,2,3)
print(type(t),t)

当元组中只有一个字符串类型的元素时,该元素后面必须要加一个逗号,,否则 Python 解释器会将它视为字符串。

t2 = ('hello')
print(type(t2))  # <class 'str'>

t3 = ('hello', )
print(type(t3))  # <class 'tuple'>

使用tuple()函数创建元组:

#将字符串转换成元组
tup1 = tuple("hello")
print(tup1)

#将列表转换成元组
list1 = ['Python', 'Java', 'C++', 'JavaScript']
tup2 = tuple(list1)
print(tup2)

#将字典转换成元组
dict1 = {'a':100, 'b':42, 'c':9}
tup3 = tuple(dict1)
print(tup3)   # ('a', 'b', 'c')

#将区间转换成元组
range1 = range(1, 6)
tup4 = tuple(range1)
print(tup4)

#创建空元组
print(tuple())

2) 访问元组元素

  • 使用索引访问单个元素。
  • 使用切片访问一组元素。
url = tuple("www.baidu.com")
print(url)   # ('w', 'w', 'w', '.', 'b', 'a', 'i', 'd', 'u', '.', 'c', 'o', 'm')
print(url[4])  # b
print(url[-2])  # o

print(url[1:5])  # ('w', 'w', '.', 'b')
print(url[-6:-1])  # ('d', 'u', '.', 'c', 'o')

3)修改元组

元组是不可变序列,元组中的元素不能被修改,所以我们只能创建一个新的元组替代旧的元组

  • 对元组变量进行重新赋值。
t5 = (1,2,3,5)
print(t5)  #(1, 2, 3, 5)
t5 = ('java', 'python', 'linux')
print(t5)  # ('java', 'python', 'linux')
  • 通过连接多个元组(使用+可以拼接元组)的方式向元组中添加新元素。
t6 = (10,20,30)
t7 = ('jack', 'tom', 'andy')
print(t6 + t7)  # (10, 20, 30, 'jack', 'tom', 'andy')

4) 删除元组

当创建的元组不再使用时,可以通过 del 关键字将其删除。

t8 = ('java', 'python', 'linux', 'C++')
print(t8)  # ('java', 'python', 'linux', 'C++')
del t8
print(t8)  # NameError: name 't8' is not defined. Did you mean: 't'?

Python 自带垃圾回收功能,会自动销毁不用的元组,所以一般不需要通过 del 来手动删除。

4、有序无序、可变与不可变

有序无序:是指可以使用下标索引的方式获取到值数据类型;只要是能够调用用_ iter _()方法获取值的数据类型都是可迭代对象;

  • 有序数据类型:字符串、列表、元组。
  • 无序数据类型:字典、集合。

可变与不可变:指是否能够对序列进行增、删、改操作;并且,增删改操作后的对象地址不发生改变

  • 不可变数据类型:整形,浮点型,字符串,复数,布尔,元组,固定集合。
  • 可变数据类型:列表,字典,集合。

5、字典操作:

python 字典(dict)是一种无序的、可变的序列,它的元素以“键值对(key-value)”的形式存储。

字典类型是 Python 中唯一的映射类型。

  • 它指的是元素之间相互对应的关系,即通过一个元素,可以唯一找到另一个元素。

在这里插入图片描述

主要特征解释
通过键而不是通过索引来读取元素字典类型有时也称为关联数组或者散列表(hash)。它是通过键将一系列的值联系起来的,这样就可以通过键从字典中获取指定项,但不能通过索引来获取。
字典是任意数据类型的无序集合和列表、元组不同,通常会将索引值 0 对应的元素称为第一个元素,而字典中的元素是无序的。
字典是可变的,并且可以任意嵌套字典可以在原处增长或者缩短(无需生成一个副本),并且它支持任意深度的嵌套,即字典存储的值也可以是列表或其它的字典。
字典中的键必须唯一字典中,不支持同一个键出现多次,否则只会保留最后一个键值对。
字典中的键必须不可变字典中每个键值对的键是不可变的,只能使用数字、字符串或者元组,不能使用列表。
dit = {'id':1, 'name':'xiaoche', 'email':'12345@qq.com'}
print(dit,type(dit))

1) 创建字典:

使用 { } 创建字典:
  • 键和值之间使用冒号:分隔。
  • 相邻元素之间使用逗号,分隔。
  • 同一字典中的各个键必须唯一,不能重复。
scores = {
    '语文': 98,
    '数学': 81,
    '英语': 87,
    '体育': 21,
}
print(scores)  # {'语文': 98, '数学': 81, '英语': 87, '体育': 21}
#使用元组和数字作为key
dict1 = {(20, 30): 'great', 30: [1,2,3]}
print(dict1)

#创建空元组
dict2 = {}
print(dict2)

从上面可以看出:字典的键可以是整数、字符串或者元组,只要符合唯一和不可变的特性就行;字典的值可以是 Python 支持的任意数据类型。

通过 fromkeys() 方法创建字典:
lst = ['语文', '数学', '英语']
scores = dict.fromkeys(lst,80)  # 默认值为80,若不写,则为none
print(scores)
通过 dict() 映射函数创建字典
a = dict(name = '张三', passwd = 1234)
print(a)  # {'name': '张三', 'passwd': 1234}
通过应用 dict() 函数和 zip() 函数,可将前两个列表转换为对应的字典。
t1 = ('英语', '数学', '语文')  # #还可以是字符串或列表
l1 = [90,87,45]   #还可以是字符串或元组
a = dict(zip(t1,l1))
print(a)

2) 访问字典元素

通过键来访问对应的值。
  • 元素无序,位置不固定,不能使用切片一次性访问多个元素。
d2 = {
    'id': 1,
    'name': 'xiaoch',
    'age': 21,
    'address': '杭州',
}
print(d2)  # {'id': 1, 'name': 'xiaoch', 'age': 21, 'address': '杭州'}
print(d2['name'])  # xiaoch
print(d2['id'])   # 1
print(d2['eamil'])  # KeyError: 'eamil'

注意,键必须是存在的,否则会抛出异常。

get() 方法来获取指定键对应的值
  • 当指定的键不存在时,get() 方法不会抛出异常。
d2 = {
    'id': 1,
    'name': 'xiaoch',
    'age': 21,
    'address': '杭州',
}
print(d2.get('email'))  # none
print(d2.get('address'))  # 杭州

当键不存在时,get() 返回空值 None,如果想明确地提示用户该键不存在,那么可以手动设置 get() 的第二个参数。

print(d2.get('email', '12345@qq.com'))  # 12345@qq.com

3) 删除字典:

和删除列表、元组一样,手动删除字典也可以使用 del 关键字。

del d2
print(d2)  # NameError: name 'd2' is not defined

Python 自带垃圾回收功能,会自动销毁不用的字典,所以一般不需要通过 del 来手动删除。

4) 字典添加键值对:

  • 直接给不存在的 key 赋值即可。
dit = {
    '语文': 91,
    '数学': 87,
    '英语': 76,
}
print(dit)  # {'语文': 91, '数学': 87, '英语': 76}

dit['体育'] = 32
print(dit)  # {'语文': 91, '数学': 87, '英语': 76, '体育': 32}

dit['java'] = 96
print(dit)  # {'语文': 91, '数学': 87, '英语': 76, '体育': 32, 'java': 96}

5) 字典修改键值对:

Python 字典中键(key)的名字不能被修改,我们只能修改值(value)

  • 将原先的值修改。
dit['语文'] = 79
print(dit)  # {'语文': 79, '数学': 87, '英语': 76, '体育': 32, 'java': 96}

6) 字典删除键值对:

del dit['英语']
del dit['体育']
print(dit)   # {'语文': 79, '数学': 87, 'java': 96}

7) 字典是否存在键值对:

  • 一般是判断字典是否包含指定的键。
  • 用in 或者 not in 运算符。
print('数学' in dit)  # True
print('python' in dit)  # False

8) 字典中的方法:

使用 dir(dict) 来查看该类型包含哪些方法。

print(dir(dict))
['clear', 'copy', 'fromkeys', 'get', 'items', 'keys', 'pop', 'popitem', 'setdefault', 'update', 'values']
① keys、values、items方法
  • keys() 方法用于返回字典中的所有键(key);
  • values() 方法用于返回字典中所有键对应的值(value);
  • items() 用于返回字典中所有的键值对(key-value)。
d2 = {'语文': 87, '数学': 98, '英语': 76}
print(d2.keys())  # dict_keys(['语文', '数学', '英语'])
print(d2.values())  # dict_values([87, 98, 76])
print(d2.items())   # dict_items([('语文', 87), ('数学', 98), ('英语', 76)])

若想操作这几个方法的返回值:

  • 使用 list() 函数,将它们返回的数据转换成列表。
  • 使用 for in 循环遍历它们的返回值。
l2 = list(d2.keys())
print(l2)   # ['语文', '数学', '英语']

for i in d2.keys():
    print(i)
语文
数学
英语
② copy()方法:

copy() 方法返回一个字典的拷贝,也即返回一个具有相同键值对的新字典

d3 = {'one': 1, 'two': 2, 'three': 3}
d4 = d3.copy()
print(id(d3), d3)  # 1493226277248 {'one': 1, 'two': 2, 'three': 3}
print(id(d4), d4)  # 1493226287168 {'one': 1, 'two': 2, 'three': 3}

注意,copy() 方法所遵循的拷贝原理,既有深拷贝,也有浅拷贝。

  • 上面的例子是深拷贝,对键值对进行了拷贝,从新开了个新内存来存放。

  • 对于某些列表类型的值来说,此方法对其做的是浅拷贝,也就是说,d4 中的 [1,2,3] 的值不是自己独有,而是和 d3 共有。

d3 = {'one': 1, 'two': 2, 'three': [1,2,3]}
d4 = d3.copy()
print("列表id", id(d3['three']), "字典d3的id", id(d3))  # 列表id 2557259429568 字典d3的id 2557256518016
print("列表id", id(d4['three']), "字典d4的id", id(d4))  # 列表id 2557259429568 字典d4的id 2557256527936

d3['four'] = 4
print(d3)  # {'one': 1, 'two': 2, 'three': [1, 2, 3], 'four': 4}
print(d4)   # {'one': 1, 'two': 2, 'three': [1, 2, 3]}

d3['three'].remove(1)
print(d3)   # {'one': 1, 'two': 2, 'three': [2, 3], 'four': 4}
print(d4)   # {'one': 1, 'two': 2, 'three': [2, 3]}

在这里插入图片描述

③ update() 方法

update() 方法可以使用一个字典所包含的键值对来更新己有的字典。

  • 如果被更新的字典中己包含对应的键值对,那么原 value 会被覆盖;
  • 如果被更新的字典中不包含对应的键值对,则该键值对被添加进去。
d5 = {'one': 1, 'two': 2, 'three': 3}
d5.update({'one': 10, 'four': 20})
print(d5)  # {'one': 10, 'two': 2, 'three': 3, 'four': 20}
④ pop() 和 popitem() 方法
  • pop() 和 popitem() 都用来删除字典中的键值对。
  • pop() 用来删除指定的键值对。
  • popitem() 用来随机删除一个键值对。
d6 = {'数学': 95, '语文': 89, '英语': 90, '化学': 83, '生物': 98, '物理': 89}
d6.pop('英语')
print(d6)  # {'数学': 95, '语文': 89, '化学': 83, '生物': 98, '物理': 89}
d6.popitem()
print(d6)   # {'数学': 95, '语文': 89, '化学': 83, '生物': 98}

注意:说 popitem() 随机删除字典中的一个键值对是不准确的,虽然字典是一种无须的列表,但键值对在底层也是有存储顺序的,popitem() 总是弹出底层中的最后一个 key-value,这和列表的 pop() 方法类似,都实现了数据结构中“出栈”的操作。

⑤ setdefault() 方法:

setdefault() 方法用来返回某个 key 对应的 value。

  • 如果该 key 存在,那么直接返回该 key 对应的 value;
  • 如果该 key 不存在,那么先为该 key 设置默认的 defaultvalue,然后再返回该 key 对应的 defaultvalue。
  • 如果没设置默认的 defaultvalue,则是none。
d7 = {'数学': 95, '语文': 89, '英语': 90}
d7.setdefault('物理', 17)
print(d7)  # {'数学': 95, '语文': 89, '英语': 90, '物理': 17}
d7.setdefault('化学')
print(d7)   # {'数学': 95, '语文': 89, '英语': 90, '物理': 17, '化学': None}
d7.setdefault('数学', 100)
print(d7)   # {'数学': 95, '语文': 89, '英语': 90, '物理': 17, '化学': None}

6、集合操作

  1. 集合中的元素都是唯一的,互不相同。

  2. Python 集合会将所有元素放在一对大括号 {} 中,相邻元素之间用“,”分隔。

  3. 只能存储不可变的数据类型,包括整形、浮点型、字符串、元组

Python 中有两种集合类型,一种是 set 类型的集合,另一种是 frozenset 类型的集合,它们唯一的区别是,set 类型集合可以做添加、删除元素的操作,而 forzenset 类型集合不行。

1)创建set集合:

  • 使用 {} 创建。
s1 = {1,'c',1,(1,2,3),'c'}
print(s1)
  • 使用 set() 函数将字符串、列表、元组、range 对象等可迭代对象转换成集合。。
str = "hello,world"
s2 = set(str)
print(s2)   # {'d', 'r', 'o', 'l', 'h', 'e', ',', 'w'}

lst = ['python', 'java', 'linux']
s3 = set(lst)
print(s3)  # {'linux', 'python', 'java'}

t = ('英语', '数学', '语文')
s4 = set(t)
print(s4)   # {'语文', '英语', '数学'}

2) 问set集合元素:

使用循环结构,将集合中的数据逐一读取出来。

s02 = {'java', 'python', 'linux', 'C++'}
for i in s02:
    print(i,end=' ')   # python java C++ linux 

3)删除set集合:

使用 del() 语句。python会自动释放不使用的set集合。

4)set集合添加元素:

使用add() 方法。

  • 使用 add() 方法添加的元素,只能是数字、字符串、元组或者布尔类型(True 和 False)值。也就是不可变的数据。
  • 不能添加列表,字典,集合这种可变数据。
s02.add('Vue')
print(s02)   # {'java', 'linux', 'Vue', 'C++', 'python'}

5) 集合删除元素:

使用 remove() 方法。

  • 如果被删除元素本就不包含在集合中,则此方法会抛出 KeyError 错误。
  • discard() 方法与remove() 用法一样,但是此方法不会抛出异常。
s02.remove('C++')
print(s02)   # {'linux', 'java', 'python', 'Vue'}

6) 集合做交集、并集、差集运算:

运算操作Python运算符含义例子
交集&取两集合公共的元素>>> set1 & set2 {3}
并集|取两集合全部的元素>>> set1 | set2 {1,2,3,4,5}
差集-取一个集合中另一集合没有的元素>>> set1 - set2 {1,2} >>> set2 - set1 {4,5}
对称差集^取集合 A 和 B 中不属于 A&B 的元素>>> set1 ^ set2 {1,2,4,5}

7) 集合的方法:

dir(set)  # 查看集合的方法
  • add() 方法,像集合中添加元素,上面已例举。
  • clear() 方法。清空集合中的所有元素。
s02.clear()
print(s02)  # set()
  • copy() 方法,拷贝集合元素。
s03 = {10,20,30}
s04 = s03.copy()
print(id(s03), s03)  # 2790463051744 {10, 20, 30}
print(id(s04), s04)  # 2790463050176 {10, 20, 30}
  • difference() 方法。将 set1 中有而 set2 没有的元素给 set3。
s05 = {10,20,30}
s06 = {10,100,1000}
s07 = s05.difference(s06)
print(s07)  # {20, 30}
  • difference_update() 方法。从 set1 中删除与 set2 相同的元素。
s05.difference_update(s06)
print(s05)  # {20, 30}
  • discard() 方法。与remove() 方法用法一样,但是此方法不会抛异常。

  • intersection()。取 set1 和 set2 的交集给 set3。

s08 = {10,20,30}
s09 = {30,40,50}
s10 = s08.intersection(s09)
print(s10)  # {30}
  • intersection_update()。 取 set1和 set2 的交集,并更新给 set1。
s08.intersection_update(s09)
print(s08)  # {30}
  • isdisjoint()。判断 set1 和 set2 是否有交集,有交集返回 False;没有交集返回 True。
print(s08.isdisjoint(s09))  # False
  • issubset()。判断 set2 是否是 set1 的子集。
print(s08.issubset(s09))  # True
  • pop()。取 set1 中一个元素,并赋值给 a。
a = s09.pop()
print(a)  # 40
  • symmetric_difference()。取 set1 和 set2 中互不相同的元素,给 set3。
s = {10,20,30}
s02 = {10,100,1000}
s03 = s.symmetric_difference(s02)
print(s03)  # {100, 1000, 20, 30}
  • symmetric_difference_update()。取 set1 和 set2 中互不相同的元素,并更新给 set1。

  • union()。取 set1 和 set2 的并集,赋给 set3。

s03 = s.union(s02)
print(s03)  # {20, 100, 1000, 10, 30}
  • update()。添加列表或集合中的元素到 set1。
ss = {1,2,3}
lst = ['jack', 'tom']
ss.update(lst)
print(ss)  # {1, 2, 3, 'tom', 'jack'}

tt = ('python', 'java')
ss.update(tt)
print(ss)  # {1, 2, 3, 'java', 'jack', 'tom', 'python'}

7、zip函数:

zip() 函数是 Python内置函数之一,它可以将多个序列(列表、元组、字典、集合、字符串以及 range() 区间构成的列表)“压缩”成一个 zip 对象。所谓“压缩”,其实就是将这些序列中对应位置的元素重新组合,生成一个个新的元组。

my_list = [11,12,13]
my_tuple = (21,22,23)
print([x for x in zip(my_list,my_tuple)])  # [(11, 21), (12, 22), (13, 23)]

my_dic = {31:2,32:4,33:5}
my_set = {41,42,43,44}
print([x for x in zip(my_dic)])  # [(31,), (32,), (33,)]

my_pychar = "python"
my_shechar = "shell"
print([x for x in zip(my_pychar,my_shechar)])  # [('p', 's'), ('y', 'h'), ('t', 'e'), ('h', 'l'), ('o', 'l')]

lst = [11,12,13]
t = (21,22,23)
print({x for x in zip(lst,t)})  # {(12, 22), (11, 21), (13, 23)}

d = {'id': 1, 'name': 'tom', 'age': 21}
s = {'linux', 'python', 'java'}
print({x for x in zip(d,s)})   # {('name', 'linux'), ('age', 'java'), ('id', 'python')}

当多个序列中元素个数不一致时,会以最短的序列为准进行压缩。

lst = [11,12,13]
t = (21,22,23,24,25)
print({x for x in zip(lst,t)})  # {(12, 22), (11, 21), (13, 23)}

8、reversed 函数

reversed 函数:对于给定的序列(包括列表、元组、字符串以及 range(n) 区间),该函数可以返回一个逆序序列的迭代器(用于遍历该逆序序列)。

lst = [1,2,3,4,5]
print([x for x in reversed(lst)])  # [5, 4, 3, 2, 1]

str = 'hello'
print([x for x in reversed(str)])  # ['o', 'l', 'l', 'e', 'h']
  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python编程语言中,有四种常用的集合数据类型,它们分别是列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set)。列表是一种有序和可更改的集合,允许重复的成员。元组是一种有序且不可更改的集合,也允许重复的成员。字典是一个无序、可变且有索引的集合,其中没有重复的成员。而集合是一种无序和无索引的集合,没有重复的成员。这四种集合数据类型在Python中都有着不同的特点和用途。 在Python中,列表元组和字符串都属于序列,它们的元素都可以通过编号进行访问。而字典则属于映射,其中的元素是以键值对的形式存在的。集合则不属于序列或映射中的任何一种,它是一种独立的数据类型,用于存储一组不重复的元素。 总结起来,Python中的列表(List)、元组(Tuple)、字典(Dictionary)和集合(Set)都是常用的集合数据类型,它们各自有着不同的特点和用途。列表是有序和可更改的集合元组是有序且不可更改的集合字典是无序、可变且有索引的集合集合是无序和无索引的集合。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [浅谈python四种集合数据类型—【列表元组集合字典】](https://blog.csdn.net/QWERTYzxw/article/details/121479048)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [python 元组集合字典](https://download.csdn.net/download/weixin_38603219/13752298)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值