进阶2:容器(元组、列表、字典)的处理总结

元组

在 Python 中,元组(tuple)是一种用于存储多个项目的内置数据类型。元组与列表相似,以下是元祖的特点:

  1. 不可变性:元组一旦创建,其内容就无法更改。这意味着你不能修改、添加或删除元组中的元素。
  2. 使用小括号:元组是用小括号 () 定义的,而列表是用方括号 []
  3. 可以存储不同类型的数据:元组可以包含不同类型的数据,比如整数、字符串、浮点数,甚至可以包含其他元组、列表等。
  4. 有序:元组是有序的集合,这意味着元素有一个定义好的顺序,每个元素可以通过索引访问。

创建一个简单的元组的例子如下:

my_tuple = (1, 2, 3, "Hello", 5.0)

元组的定义和下标使用

定义一个空元组
进阶2:容器(元组、列表、字典)的处理总结
定义包含元素的元组
进阶2:容器(元组、列表、字典)的处理总结

元祖的复杂定义形式

进阶2:容器(元组、列表、字典)的处理总结
定义具有一个元素的元组,特殊,注意,重点
进阶2:容器(元组、列表、字典)的处理总结
使用类型名定义元组
进阶2:容器(元组、列表、字典)的处理总结

字符串放入到元祖中,元祖会将字符串迭代出来

进阶2:容器(元组、列表、字典)的处理总结
元组的下标访问,元组也不能使用超出范围的下标,会出现越界错误
进阶2:容器(元组、列表、字典)的处理总结
元组是一种 不可变类型,不能修改元组中的元素值 ,修改会报错
进阶2:容器(元组、列表、字典)的处理总结

元祖的遍历

# 元组的遍历
# for-in
t = (1,2,3,4,5,'hello')
for v in t:
    print(v)


# 循环配合下标方式 一
for i in range(len(t)):
    print(t[i])


# 循环配合下标方式 二
i = 0
while i < len(t):
    print(t[i])
    i += 1
进阶2:容器(元组、列表、字典)的处理总结

嵌套元祖的定义和遍历

通过 isinstance 判断 遍历的元素是否是一个元组
# 定义一个嵌套元组
t = (1,2,3,(4,5,6),(7,8,9))

# 遍历
for v in t:
    # isinstance() 判断参数一是否是参数二的类型对象
    # 通过 isinstance 判断 遍历的元素是否是一个元组,
    # 如果是就继续遍历,不是直接 输出
    if isinstance(v,tuple):
        for v2 in v:
            print(v2)
    else:
        print(v)
进阶2:容器(元组、列表、字典)的处理总结

补充:

isinstance() 是一个内置函数,用于检查一个对象是否是指定类的实例,或者是否是该类的子类的实例。它的语法是:

isinstance() 返回 True 如果对象是 classinfo 的一个实例,或者是其子类的一个实例;否则返回 False

# 检查一个变量是否是整数类型
x = 10
print(isinstance(x, int))  # 输出: True

# 检查一个变量是否是元组中指定的类型之一
y = 3.14
print(isinstance(y, (int, float)))  # 输出: True

# 自定义类的例子
class Animal:
    pass

class Dog(Animal):
    pass

d = Dog()
print(isinstance(d, Dog))    # 输出: True
print(isinstance(d, Animal)) # 输出: True

在上述例子中,isinstance() 可用于检查对象的类型关系,特别是在继承层次结构中,它比单纯使用类型比较更灵活。

元组的常用方法

统计元素个数和查找元素的位置索引

t = (1,2,3,4,55,5,5,6,6,2,3,2)

# 提示中方法名前面的 m 表示 是一个方法, method
print(t.count(2))
print(t.index(2))
print(t.index(2,3,5)) # ValueError: tuple.index(x): x not in tuple
进阶2:容器(元组、列表、字典)的处理总结

列表

列表的定义和下标使用

列表定义

进阶2:容器(元组、列表、字典)的处理总结

下标使用

列表遍历

进阶2:容器(元组、列表、字典)的处理总结

字符串放入到列表中,列表会将字符串迭代出来

进阶2:容器(元组、列表、字典)的处理总结
进阶2:容器(元组、列表、字典)的处理总结
重点:列表的特性,可以通过 下标修改对应位置上的数据
进阶2:容器(元组、列表、字典)的处理总结

列表的排序和逆序

在列表排序和逆序之前,我们先看一下字符串的排序和逆序思路:

s='hello'
def revers_str(s):
    # 定义一个空字符串,用来拼接
    ret_s=''
    i=len(s)-1
    while i >= 0:
        ret_s+=s[i]
        i-=1
    return ret_s
print(revers_str(s))
进阶2:容器(元组、列表、字典)的处理总结

但是此时我们学习了列表,列表有一个逆序的函数可以直接使用

'''
列表的排序和逆序
'''
cl = [9,2,5,7,1,8,4,3,0,6]

print(cl)
# 排序 默认升序排序(从小到大),列表为可变数据,列表排序后改变了原来的顺序,因为已经改变了原有数据,无需进行打印,所以默认返回为空
print(cl.sort())
print(cl)
进阶2:容器(元组、列表、字典)的处理总结

降序排序

进阶2:容器(元组、列表、字典)的处理总结

逆序排序(直接将元列表中的顺序进行逆转,注意区别于降序排序)

进阶2:容器(元组、列表、字典)的处理总结

由此我们可以推断reverse()函数的由来

cl = [9,2,5,7,1,8,4,3,0,6]


def reverse_list(cl):
    # 定义一个空列表
    ret_l=[]
    i=len(cl)-1
    while i>=0:
        ret_l.append(cl[i])
        i-=1
    return ret_l

print(reverse_list(cl))
进阶2:容器(元组、列表、字典)的处理总结

逆序字符串可以先将字符串转换为列表,然后直接使用reverse()转换

进阶2:容器(元组、列表、字典)的处理总结

reverse()实现原理:

在 Python 内部,reverse() 通过类似的方法完成列表反转的操作,但它是原地修改列表,也就是说它不返回新列表,而是直接修改原列表。

初始状态:

left = 0, right = 4
lst = [1, 2, 3, 4, 5]
第一次交换:
  交换 lst[0] 和 lst[4],即交换 1 和 5。
  更新后的列表:[5, 2, 3, 4, 1]。
  左指针移动:left = 1,右指针移动:right = 3。
第二次交换:
  交换 lst[1] 和 lst[3],即交换 2 和 4。
  更新后的列表:[5, 4, 3, 2, 1]。
  左指针移动:left = 2,右指针移动:right = 2。
由于此时左指针与右指针相遇(left >= right),算法终止。
最终列表:[5, 4, 3, 2, 1]。

伪代码实现

def reverse(lst):
    left = 0
    right = len(lst) - 1
    
    while left < right:
        # 交换左指针和右指针所指向的元素
        lst[left], lst[right] = lst[right], lst[left]
        
        # 更新指针
        left += 1
        right -= 1

常用方法

append() 追加数据(单个元素)

进阶2:容器(元组、列表、字典)的处理总结

extend() 可以将参数中的容器对象中的每个元素添加扩展到源列表中

# extend() 扩展
# 可以将参数中的容器对象中的每个元素添加扩展到源列表中
cl1 = [1,2,3]
cl2 = ['a','b','c',[5,6]]
# cl1.append(cl2)
cl1.extend(cl2)
print(cl1)
进阶2:容器(元组、列表、字典)的处理总结

insert()

格式:list.insert(index, element)

进阶2:容器(元组、列表、字典)的处理总结

边界情况:注意:在插入数据时,没有下标越界问题

索引越界:如果指定的 index 小于 0 或大于列表的长度,元素会被追加到列表的末尾。

my_list = [1, 2, 3]
my_list.insert(5, 'out_of_bounds')  # 索引 5 超过了列表的长度
print(my_list)  # 输出: [1, 2, 3, 'out_of_bounds']

插入空元素:如果你插入 None 或者一个空的元素,也会按指定位置插入。

my_list = [1, 2, 3]
my_list.insert(1, None)  # 在索引1的位置插入 None
print(my_list)  # 输出: [1, None, 2, 3]

原理:链表从中间插入数据

下标修改

index()

进阶2:容器(元组、列表、字典)的处理总结

count()

进阶2:容器(元组、列表、字典)的处理总结

in && not in

进阶2:容器(元组、列表、字典)的处理总结

pop()

格式:list.pop([index])

index(可选):指定要删除的元素的索引位置。
如果 index 超出列表的范围,会引发 IndexError 错误。
如果不指定 index,则默认移除最后一个元素。

进阶2:容器(元组、列表、字典)的处理总结

remove()

删除 指定对象,当有多个相同对象时,只删除 第一个

进阶2:容器(元组、列表、字典)的处理总结

clear()

清空列表元素

进阶2:容器(元组、列表、字典)的处理总结

del

cl = [1,2,3,4,5,6,7,3,7,8,90,91,0]

# del 删除角标写法有两种方式
del cl[1]
print(cl)

del(cl[1])
print(cl)
进阶2:容器(元组、列表、字典)的处理总结

删除整个列表

进阶2:容器(元组、列表、字典)的处理总结

注意:在使用列表时,不要在循环遍历时删除元素

进阶2:容器(元组、列表、字典)的处理总结

字典

字典的定义和元素访问

定义

进阶2:容器(元组、列表、字典)的处理总结

理论,所以不可变的类型都可以做为key,

只要是可hash的的对象都可以做为key

key一般情况下使用字符串类型的数据充当

进阶2:容器(元组、列表、字典)的处理总结

访问

字典也是通过下标方式来访问元素,但是字典中没有索引,也就是没有下标编号
字典通过下标的中括号中书写key的方式 来直接 访问key所对应的值
如果使用了不存在的key,会报错

进阶2:容器(元组、列表、字典)的处理总结

字典也是一个可变类型

进阶2:容器(元组、列表、字典)的处理总结

字典get()

刚才已经得知:下标方式 在访问数据时,如果key不存在,会报错

get方法方式 访问数据时,如果key不存在,返回None

进阶2:容器(元组、列表、字典)的处理总结

字典的遍历

方式一

# 默认情况下,使用for-in遍历时,会将所有的key遍历出来

进阶2:容器(元组、列表、字典)的处理总结

方式二

keys()方法

进阶2:容器(元组、列表、字典)的处理总结

方式三

values() 方法

进阶2:容器(元组、列表、字典)的处理总结
方式四,将每个元素(键值对)打包成一个元祖
items()
进阶2:容器(元组、列表、字典)的处理总结

上面第二种方式涉及到了解包思想:

a,b,c,d,e = item 
# a,b,c,d,e = item[0],item[1],item[2],item[3],item[4]省略写法
进阶2:容器(元组、列表、字典)的处理总结

字典的常用方法:

如果在赋值时,使用的key在字典中不存在,那么就是向字典中添加数据
进阶2:容器(元组、列表、字典)的处理总结

如果在赋值 时,使用的key在字典中存在,那么就修改这个key所对应的值
字典中的key 具有唯一性
如果key不存在,那么就是添加 数据,如果key存在就是修改数据
key 是不能修改的
进阶2:容器(元组、列表、字典)的处理总结

pop: 删除指定键的键值对,并返回该键关联的值。如果键不存在,还可以指定一个默认值返回。

popitem 删除最后一个键值对
进阶2:容器(元组、列表、字典)的处理总结
pop(key)可以通过指定key来删除任意位置的键值对
进阶2:容器(元组、列表、字典)的处理总结

del: 只删除指定的键值对,不返回任何值。如果键不存在,会引发一个 KeyError

进阶2:容器(元组、列表、字典)的处理总结

将整个字典删除

进阶2:容器(元组、列表、字典)的处理总结

clear()清空字典中的键值对

进阶2:容器(元组、列表、字典)的处理总结

进阶2:容器(元组、列表、字典)的处理总结

字典练习:保存名片

练习要求:

函数一: 建立名片-> 建立好的名片(需要姓名,年龄,地址信息)

函数二: 显示名片-> 接收名片信息,打印名片信息

进阶2:容器(元组、列表、字典)的处理总结

有序字典和无序字典

在 Python 的早期版本(例如 3.7 之前),字典本身不是有序的。为了创建一个有序的字典,你可以使用 collections 模块中的 OrderedDictOrderedDict 会记住插入键值对的顺序。

from collections import OrderedDict

# 创建一个有序字典
ordered_dict = OrderedDict()

# 添加一些键值对
ordered_dict['first'] = 1
ordered_dict['second'] = 2
ordered_dict['third'] = 3

# 打印有序字典
for key, value in ordered_dict.items():
    print(key, value)
进阶2:容器(元组、列表、字典)的处理总结
在Python中,有序字典(OrderedDict)和无序字典(普通的dict)之间主要有以下几个区别:

1、顺序性:
OrderedDict: 按照键值对插入的顺序维护顺序。这意味着当迭代OrderedDict时,元素会按照插入的顺序返回。
普通的dict: 从Python 3.7开始,标准的dict也维护插入顺序。在此之前,dict不保证顺序,虽然在Python 3.6的一些实现中也是保留了插入顺序。

2、性能:
OrderedDict: 由于需要维护顺序,性能上可能会稍微逊色于普通的dict,尤其是在插入和删除操作上。
普通的dict: 因为从3.7版本开始就维护了插入顺序,其性能通常会更为高效。

3、使用场景:
OrderedDict: 当你需要在所有Python版本中(包括老版本)都确保字典的迭代顺序与插入顺序一致时,可以使用OrderedDict。
普通的dict: 在现代Python版本中使用普通的dict通常就能满足对顺序的要求,除非你需要OrderedDict提供的额外方法。

4、额外方法:
OrderedDict: 提供了一些dict没有的方法,比如move_to_end(),它可以用来移动某个键到字典的开头或末尾。

集合

在 Python 中,集合(set)是一种数据类型,它类似于列表(list)和字典(dictionary),但具有一些独特的特性。集合是一组无序且不重复的元素。它主要用于需要去重或者需要对元素进行数学集合运算的场合。

集合的特点

  1. 无序性:集合中的元素没有特定的顺序,因此无法通过索引进行访问。
  2. 去重:集合自动去除重复的元素。
  3. 可变性:集合本身是可变的,可以添加或删除元素,但集合中的元素必须是可哈希(hashable)的,即不可变的数据类型,如整数、字符串、元组等。

应用场景

  • 去重:从列表中移除重复项,保持元素的唯一性。
  • 数学运算:计算集合之间的交集、并集、差集等,特别适合统计、集合论等领域。
  • 快速查询:由于集合基于哈希表实现,查询操作通常比列表更快。

集合的基本操作

创建集合

s1 = {1, 2, 3, 4}
s2 = set([3, 4, 5, 6])
进阶2:容器(元组、列表、字典)的处理总结

定义一个空集合

# s = {} # 这种方式 是定义一个空字典,不是集合
s = set()
print(s)
print(type(s))
进阶2:容器(元组、列表、字典)的处理总结

添加元素

可以使用 add() 方法向集合添加元素。

s1.add(5)
进阶2:容器(元组、列表、字典)的处理总结

删除元素

  • 使用 remove() 方法删除指定的元素,若元素不存在会引发 KeyError
  • 使用 discard() 方法删除指定的元素,若元素不存在不会引发错误。
  • 使用 pop() 方法删除并返回一个任意元素,集合为空时会引发 KeyError
   s1.remove(3)
   s1.discard(10)  # 不会抛出异常
   s1.pop()

集合运算

交集:set1 & set2 或 set1.intersection(set2)
并集:set1 | set2 或 set1.union(set2)
差集:set1 - set2 或 set1.difference(set2)
对称差集:set1 ^ set2 或 set1.symmetric_difference(set2)
进阶2:容器(元组、列表、字典)的处理总结

集合的去重功能

进阶2:容器(元组、列表、字典)的处理总结

集合遍历

进阶2:容器(元组、列表、字典)的处理总结

注意: 集合是不支持下标的

进阶2:容器(元组、列表、字典)的处理总结

容器类型之间的类型转换

set-list-tuple三者类型间转换

字符串转列表、列表转集合(集合是无序排序)、字符串转集合
进阶2:容器(元组、列表、字典)的处理总结
列表转字符串
进阶2:容器(元组、列表、字典)的处理总结

公共方法:

进阶2:容器(元组、列表、字典)的处理总结

容器其他内置函数:

进阶2:容器(元组、列表、字典)的处理总结

容器内置函数总结:

列表 (List)
append(x): 在列表的末尾添加元素 x。
extend(iterable): 用可迭代对象中的元素扩展列表。
insert(i, x): 在指定位置 i 插入元素 x。
remove(x): 移除列表中第一个值为 x 的元素。
pop([i]): 移除并返回指定位置 i 的元素,不指定则移除并返回最后一个元素。
clear(): 移除列表中的所有元素。
index(x[, start[, end]]): 返回指定值 x 的第一个匹配项的索引。
count(x): 返回元素 x 在列表中出现的次数。
sort(key=None, reverse=False): 对列表进行排序。
reverse(): 反转列表中的元素。
copy(): 返回列表的浅复制。

元组 (Tuple)
元组是不可变的,所以没有修改它们的方法。可以使用以下方法:
count(x): 返回元素 x 在元组中出现的次数。
index(x[, start[, end]]): 返回指定值 x 的第一个匹配项的索引。

集合 (Set)
add(elem): 向集合中添加元素 elem。
remove(elem): 移除集合中的元素 elem,如果不存在则抛出错误。
discard(elem): 移除集合中的元素 elem,如果不存在不抛出错误。
pop(): 移除并返回集合中的一个不确定的元素。
clear(): 移除集合中的所有元素。
update(*others): 用其他集合的元素更新集合。
union(*others): 返回包含集合及其他集合中所有元素的新集合。
intersection(*others): 返回集合与其他集合的交集。
difference(*others): 返回集合与其他集合的差集。
symmetric_difference(other): 返回集合与另一个集合的对称差集。

字典 (Dictionary)
clear(): 移除字典中的所有元素。
copy(): 返回字典的浅复制。
fromkeys(iterable, value=None): 创建一个新字典,键来自 iterable,值是 value。
get(key, default=None): 返回键 key 的值,不存在则返回 default。
items(): 返回字典的 (key, value) 对的视图。
keys(): 返回字典键的视图。
pop(key[, default]): 移除并返回键 key 的值,不存在则返回 default。
popitem(): 移除并返回字典中的一个 (key, value) 对,通常是最后插入的。
setdefault(key, default=None): 如果键不存在,则设置 key 的值为 default。
update([other]): 使用 other 更新字典。
values(): 返回字典值的视图。
这些方法为操作不同的容器结构提供了便捷的接口,了解和掌握这些方法可以帮助你更加高效地处理数据。

列表推导式

Python 列表推导式(list comprehension)是一种简洁而优雅的方式,用于创建列表。在一行代码中,可以从一个已有的可迭代对象(如列表、元组、字符串等)生成一个新的列表。这种语法使代码看起来更清晰、更易读,也通常更具备 Pythonic 风格。

格式: 列表变量 = [表达式 for 变量 in range(10)]

new_list = [new_element for element in iterable if condition]

表达式中需要使用后面的变量

例:

创建一个具有一百个数字的列表

传统方式:

c_l = []
for i in range(100):
    c_l.append(i)

使用列表推导式来完成列表的创建(注意,表达的变量使用要和循环中的变量一致)

c_l = [i for i in range(100)]

生成一个包含 1 到 10 内的所有整数的平方的列表

c_l = [x**2 for x in range(1, 11)]

带条件的列表推导式:

如果我们只想要能被 2 整除的数的平方,可以加上条件:

进阶2:容器(元组、列表、字典)的处理总结

创建一个列表 ,列表中的每个元素都是具有两个值的元组

进阶2:容器(元组、列表、字典)的处理总结

组包和拆包

组包(Packing)

组包是指将多个值组合成一个单一的元组(或其他集合类型)。这通常在需要将多个元素作为一个整体进行处理时很有用。例如,当你用逗号分隔多个值时,Python 会自动将它们打包到一个元组中。

# 例子:组包
a = 1, 2, 3  # 这实际上是 (1, 2, 3)
print(a)     # 输出: (1, 2, 3)

# 也可以显式地用括号
b = (4, 5, 6)
print(b)     # 输出: (4, 5, 6)
进阶2:容器(元组、列表、字典)的处理总结

拆包(Unpacking)
拆包是指把一个元组或列表中包含的多个值分配给多个变量。这在需要将集合的元素进行单独处理时非常有用。在拆包中,变量的数量必须和被拆包的集合中元素的数量相同(如果变量数量不够,报错为ValueError: too many values to unpack,如果变量数量过多,报错 ValueError: not enough values to unpack)。

进阶2:容器(元组、列表、字典)的处理总结

拆包不仅限于元组,对列表、集合等其他可迭代对象也可以进行。

进阶2:容器(元组、列表、字典)的处理总结

特殊用法
在拆包时,你可以使用星号(*)来捕获多余的值。如果在拆包时,不知道具体元素个数或者只关心其中几个元素,可以使用星号表达式:

# 使用星号解包
numbers = (1, 2, 3, 4, 5)

head, *middle, tail = numbers
print(head)   # 输出: 1
print(middle) # 输出: [2, 3, 4]
print(tail)   # 输出: 5

这种星号表达式在处理不确定长度的可迭代对象时尤其有用。

发布者:LJH,转发请注明出处:https://www.ljh.cool/41639.html

(0)
上一篇 2024年11月5日 下午4:36
下一篇 2024年11月7日 下午3:52

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注