深入探索Python数据容器:绚丽字符串、神奇序列切片与魔幻集合奇遇

一 数据容器:str(字符串)

1.1 字符串初识

  • 字符串也是数据容器的一员,字符串是一种数据容器,用于存储和处理文本数据。
  • 字符串是字符的容器,一个字符串可以存放任意数量的字符,可以包含字母、数字、标点符号、空格等字符。
  • 在Python中,字符串被表示为引号(单引号或双引号)括起来的文本。
    在这里插入图片描述
    字符串也可以通过下标进行访问
  • 从前向后,下标从0开始
  • 从后向前,下标从-1开始
my_str = "itheima and itcast"
# 通过下标索引取值
value = my_str[2]
value2 = my_str[-16]
print(f"从字符串{my_str}取下标为2的元素,。值是:{value},取下标为-16的元素。值是:{value2}")
  • 同元组一样,字符串是一个:无法修改的数据容器。 所以,以下的操作均无法完成,如果必须要做,只能得到一个新的字符串,旧的字符串是无法修改。
    • 修改指定下标的字符 (如:字符串[0] = “a”)
    • 移除特定下标的字符 (如:del 字符串[0]、字符串.remove()、字符串.pop()等)
    • 追加字符等 (如:字符串.append())

1.2 字符串常用操作

  1. 字符串创建:可以使用单引号或双引号创建字符串

    single_quoted_str = 'Hello, I am a single-quoted string.'
    double_quoted_str = "Hello, I am a double-quoted string."
    
  2. 多行字符串:需要创建跨越多行的字符串,可以使用三引号(三个连续的单引号或双引号)

    multi_line_str = '''This is a multi-line
    string created using triple quotes.'''
    
  3. 字符串拼接:通过加号运算符将多个字符串连接在一起

    str1 = "Hello, "
    str2 = "world!"
    combined_str = str1 + str2
    print(combined_str)  # Output: "Hello, world!"
    
  4. 字符串格式化:

    • Python中的字符串格式化可以使用format方法或f-strings(从Python 3.6开始):
    name = "John"
    age = 30
    formatted_str = "My name is {} and I am {} years old.".format(name, age)
    print(formatted_str)  # Output: "My name is John and I am 30 years old."# 使用 f-strings
    formatted_str_fstring = f"My name is {name} and I am {age} years old."
    print(formatted_str_fstring)  # Output: "My name is John and I am 30 years old."
    
  5. 字符串索引和切片:

    • 字符串中的每个字符都有一个索引,可以使用索引来访问单个字符。索引是从0开始的整数。还可以使用切片来获取字符串的子串
    my_str = "Hello, world!"
    print(my_str[0])     # Output: "H"
    print(my_str[7:])    # Output: "world!"
    print(my_str[:5])    # Output: "Hello"
    

1.3 字符串常用方法

方法描述示例
len(str)返回字符串的长度(字符数)len("Hello, world!") -> 13
str.lower()将字符串中的所有字母转换为小写形式"Hello, World!".lower() -> “hello, world!”
str.upper()将字符串中的所有字母转换为大写形式"Hello, World!".upper() -> “HELLO, WORLD!”
str.strip()去除字符串两边的空格(或指定的字符)" Hello, world! ".strip() -> “Hello, world!”
str.split(sep)将字符串按照指定的分隔符拆分成一个列表"apple,banana,orange".split(",") -> [‘apple’, ‘banana’, ‘orange’]
str.join(iterable)将一个字符串列表(或可迭代对象)连接成一个字符串,使用当前字符串作为连接符",".join(['apple', 'banana', 'orange']) -> “apple,banana,orange”
str.replace(old, new)替换字符串中的指定子串"Hello, world!".replace("world", "Python") -> “Hello, Python!”
str.startswith(prefix)检查字符串是否以指定的子串开头"Hello, world!".startswith("Hello") -> True
str.endswith(suffix)检查字符串是否以指定的子串结尾"Hello, world!".endswith("world!") -> True
str.find(sub)查找子串在字符串中的索引位置"Hello, world!".find("world") -> 7
str.index(sub)查找子串在字符串中的索引位置"Hello, world!".index("world") -> 7
str.count(sub)统计子串在字符串中出现的次数"abracadabra".count("a") -> 5

  • 字符串常用的内置字符串方法演示
  1. len(): 获取字符串的长度(字符数)。

    my_str = "Hello, world!"
    print(len(my_str))  # Output: 13
    
    • 数字(1、2、3…)、字母(abcd、ABCD等)、符号(空格、!、@、#、$等)、中文均算作1个字符
  2. str.lower(): 将字符串中的所有字母转换为小写形式。

    my_str = "Hello, World!"
    print(my_str.lower())  # Output: "hello, world!"
    
  3. str.upper(): 将字符串中的所有字母转换为大写形式。

    my_str = "Hello, World!"
    print(my_str.upper())  # Output: "HELLO, WORLD!"
    
  4. str.strip(): 去除字符串两边的空格(或指定的字符)。

    my_str = "   Hello, world!   "
    print(my_str.strip())  # Output: "Hello, world!"
    
    my_str = "12Hello and world21"
    new_my_str = my_str.strip("12")
    print(f"字符串{my_str}被strip('12')后,结果:{new_my_str}")
    # 字符串12itheima and itcast21被strip('12')后,结果:hello and world
    
    • 使用 strip() 方法来移除字符串开头和结尾的字符。传入了参数 “12” 给 strip() 方法,这意味着它会移除字符串开头和结尾处的所有 “1” 和 “2”。
  5. str.split(): 将字符串按照指定的分隔符拆分成一个列表。

    my_str = "apple,banana,orange"
    fruits_list = my_str.split(",")
    print(fruits_list)  # Output: ['apple', 'banana', 'orange']
    
  6. str.join(): 将一个字符串列表(或可迭代对象)连接成一个字符串,使用当前字符串作为连接符。

    fruits_list = ['apple', 'banana', 'orange']
    my_str = ",".join(fruits_list)
    print(my_str)  # Output: "apple,banana,orange"
    
  7. str.replace(): 替换字符串中的指定子串。

    my_str = "Hello, world!"
    new_str = my_str.replace("world", "Python")
    print(new_str)  # Output: "Hello, Python!"
    
  8. str.startswith(), str.endswith(): 检查字符串是否以指定的子串开头或结尾。

    my_str = "Hello, world!"
    print(my_str.startswith("Hello"))  # Output: True
    print(my_str.endswith("world!"))   # Output: True
    
  9. str.find(), str.index(): 查找子串在字符串中的索引位置。

    my_str = "Hello, world!"
    print(my_str.find("world"))   # Output: 7
    print(my_str.index("world"))  # Output: 7
    
  10. str.count(): 统计子串在字符串中出现的次数。

    my_str = "abracadabra"
    print(my_str.count("a"))  # Output: 5
    
  • 字符串类型在Python中是不可变的,这意味着字符串的值一旦创建就不能更改。因此,许多字符串方法都返回新的字符串副本,而不会改变原始字符串。

  • 字符串是Python中非常重要且常用的数据容器,它们用于处理文本和字符数据,并且有许多内置方法和操作可以使得字符串的处理更加灵活和便捷。

1.4 字符串的特点

作为数据容器,字符串有如下特点:

  • 只可以存储字符串
  • 长度任意(取决于内存大小)
  • 支持下标索引
  • 允许重复字符串存在
  • 不可以修改(增加或删除元素等)
  • 支持for循环

基本和列表、元组相同

  • 不同与列表和元组的在于:字符串容器可以容纳的类型是单一的,只能是字符串类型。
  • 不同于列表,相同于元组的在于:字符串不可修改

二 数据容器(序列)的切片

2.1 认识序列和切片

  • 序列是指:内容连续、有序,可使用下标索引的一类数据容器列表、元组、字符串,均可以可以视为序列
    在这里插入图片描述

  • 切片是一种用于从序列中获取子序列的操作,它可以轻松地获取序列的一部分,而不必修改原始序列。切片使用索引来指定子序列的起始和结束位置。

  • 序列支持切片,即:列表、元组、字符串,均支持进行切片操作

2.2 切片语法

  • 切片的语法如下:
    sequence[start:stop:step]
    
    • start:切片的起始位置(包含该位置的元素)。如果省略,则默认从序列的开头开始。
    • stop:切片的结束位置(不包含该位置的元素)。如果省略,则默认到序列的末尾结束。
    • step:切片的步长(可选参数)。它表示每隔多少个元素取一个元素。默认为1,表示每个元素都取。为负数表示反向取(注意,起始下标和结束下标也要反向标记)
# 对list进行切片,从1开始,4结束,步长1
my_list = [0, 1, 2, 3, 4, 5, 6]
result1 = my_list[1:4]      # 步长默认是1,所以可以省略不写
print(f"结果1:{my_list}")
print(f"结果1:{result1}")
  • 切片操作不会影响序列本身,而是会得到一个新的序列(列表、元组、字符串)

2.3 切片演示

以下是一些切片的示例:

  1. 使用切片获取列表的子列表:

    my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    sub_list = my_list[2:6]  # 从索引2开始到索引6(不包含6)
    print(sub_list)  # Output: [3, 4, 5, 6]
    
  2. 使用切片获取元组的子元组:

    my_tuple = (10, 20, 30, 40, 50)
    sub_tuple = my_tuple[1:4]  # 从索引1开始到索引4(不包含4)
    print(sub_tuple)  # Output: (20, 30, 40)
    
    # 对tuple进行切片,从头开始,到最后结束,步长1
    my_tuple = (0, 1, 2, 3, 4, 5, 6)
    result2 = my_tuple[:]     # 起始和结束不写表示从头到尾,步长为1可以省略
    print(result2) # (0, 1, 2, 3, 4, 5, 6)
    
  3. 使用切片获取字符串的子字符串:

    my_str = "Hello, world!"
    sub_str = my_str[7:]  # 从索引7开始到末尾
    print(sub_str)  # Output: "world!"
    
  4. 使用切片来进行反转操作:

    my_list = [1, 2, 3, 4, 5]
    reversed_list = my_list[::-1]  # 从末尾到开头,每次取一个元素
    print(reversed_list)  # Output: [5, 4, 3, 2, 1]
    
    # 对str进行切片,从头开始,到最后结束,步长-1
    my_str = "01234567"
    result4 = my_str[::-1]       
    print(result4) # 76543210
    
  5. 使用切片和步长来间隔地获取元素:

    my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9]
    step_list = my_list[::2]  # 从开头到末尾,每隔一个元素取一个
    print(step_list)  # Output: [1, 3, 5, 7, 9]
    
# 对列表进行切片,从3开始,到1结束,步长-1
my_list = [0, 1, 2, 3, 4, 5, 6]
result5 = my_list[3:1:-1]
print(f"结果5:{result5}") # [3, 2]# 对元组进行切片,从头开始,到尾结束,步长-2
my_tuple = (0, 1, 2, 3, 4, 5, 6)
result6 = my_tuple[::-2]
print(f"结果6:{result6}") # (6, 4, 2, 0)
  • 切片是Python中非常强大和实用的功能,它允许您以一种简洁的方式获取序列中的子序列,并支持许多灵活的用法。

三 数据容器:set(集合)

3.1 集合的定义格式

  • 在Python中,集合(Set)是一种无序、不重复的数据容器,用于存储一组唯一的元素。集合中的元素必须是不可变类型,例如数字、字符串、元组等。集合不支持索引和切片,因为其元素没有固定的顺序。

  • 集合使用花括号 {} 来定义,或者使用 set() 函数来创建一个空集合。如果在花括号中包含一些元素,那么就会创建一个包含这些元素的集合。

以下是几种创建集合的定义格式:

  1. 使用花括号 {} 定义集合:
my_set = {1, 2, 3, 4, 5}
  1. 使用 set() 函数定义集合:
    my_set = set([1, 2, 3, 4, 5])
    
  • 注意,如果使用空的花括号 {} 创建一个对象,Python会将其解释为一个空的字典而不是一个空的集合。因此,要创建一个空集合,必须使用 set() 函数。
  • 使用 set() 函数创建空集合:
    empty_set = set()
    
  • 需要注意的是,由于集合是无序的,每次打印集合时,元素的顺序可能不同。因为集合中元素的位置不重要,只要确保其中的元素是唯一的。

3.2 集合的特点

Python集合有以下几个主要特点:

  1. 唯一性:集合中的元素是唯一的,不允许重复。如果尝试将重复的元素添加到集合中,它们将被忽略。

  2. 无序性:集合中的元素没有固定的顺序,因此不能通过索引访问或切片操作来获取元素。这是因为集合内部使用哈希表实现,而哈希表是无序的数据结构。

  3. 可变性:集合是可变的,可以添加、删除元素。可以使用add()方法向集合中添加元素,使用remove()discard()方法删除元素。

  4. 不支持索引和切片:由于集合是无序的,因此不能通过索引或切片来访问集合中的元素。

  5. 支持数学集合操作:集合支持并集、交集、差集等数学集合操作。可以使用相应的方法如union()(并集)、intersection()(交集)、difference()(差集)来执行这些操作。

  6. 可用于去重:由于集合中的元素是唯一的,可以使用集合来对序列中的元素进行去重操作。

  7. 使用花括号 {}set() 函数来定义:集合可以使用花括号 {} 来定义,或者使用set()函数来创建。当使用花括号创建集合时,注意不要与字典的花括号混淆,因为它们的格式相同。

例如,下面是一些使用集合的示例:

# 定义集合
my_set = {1, 2, 3, 4, 5}# 添加元素
my_set.add(6)# 删除元素
my_set.remove(3)# 并集操作
set1 = {1, 2, 3}
set2 = {3, 4, 5}
union_set = set1.union(set2)  # 结果为 {1, 2, 3, 4, 5}# 交集操作
intersection_set = set1.intersection(set2)  # 结果为 {3}# 差集操作
difference_set = set1.difference(set2)  # 结果为 {1, 2}
  • 总之,Python集合是一个非常有用的数据结构,特别适用于需要存储唯一元素或执行集合操作的情况。

3.3 集合常用操作

操作描述示例
创建集合使用花括号 {}set() 函数来创建集合my_set = {1, 2, 3}
another_set = set([4, 5, 6])
添加元素使用 add() 方法向集合中添加元素my_set = {1, 2, 3}
my_set.add(4)
删除元素使用 remove()discard() 方法从集合中删除元素my_set = {1, 2, 3}
my_set.remove(2)
my_set.discard(4)
随机移除并返回元素使用pop()方法从集合中移除并返回元素my_set={1,2,3}
my_set.pop()
并集使用 union() 方法或 `` 操作符求两个集合的并集
交集使用 intersection() 方法或 & 操作符求两个集合的交集set1 = {1, 2, 3}
set2 = {3, 4, 5}
intersection_set = set1.intersection(set2)
# 或者 intersection_set = set1 & set2
差集使用 difference() 方法或 - 操作符求两个集合的差集set1 = {1, 2, 3}
set2 = {3, 4, 5}
difference_set = set1.difference(set2)
# 或者 difference_set = set1 - set2
对称差集使用 symmetric_difference() 方法或 ^ 操作符求两个集合的对称差集set1 = {1, 2, 3}
set2 = {3, 4, 5}
symmetric_difference_set = set1.symmetric_difference(set2)
# 或者 symmetric_difference_set = set1 ^ set2
判断子集和超集使用 issubset() 方法或 <= 操作符判断一个集合是否是另一个集合的子集set1 = {1, 2}
set2 = {1, 2, 3, 4}
is_subset = set1.issubset(set2)
# 或者 is_subset = set1 <= set2
使用 issuperset() 方法或 >= 操作符判断一个集合是否是另一个集合的超集set1 = {1, 2}
set2 = {1, 2, 3, 4}
is_superset = set2.issuperset(set1)
# 或者 is_superset = set2 >= set1
长度和清空集合使用 len() 函数获取集合的长度(元素个数)my_set = {1, 2, 3, 4}
length = len(my_set)
使用 clear() 方法清空集合中的所有元素my_set = {1, 2, 3, 4}
my_set.clear()

以下是Python集合的一些常见操作演示:

  1. 创建集合:使用花括号 {}set() 函数来创建集合。

    my_set = {1, 2, 3}
    another_set = set([4, 5, 6])
    
  2. 添加元素:使用add()方法向集合中添加元素。

    my_set = {1, 2, 3}
    my_set.add(4)
    
  3. 删除元素:

    • 使用remove()discard()方法从集合中删除元素。
    • remove()方法在元素不存在时会引发KeyError异常,而discard()方法则不会。
    my_set = {1, 2, 3}
    my_set.remove(2)
    my_set.discard(4)
    
  4. 随机移除并返回元素

    • 集合的 pop() 方法用于移除并返回集合中的一个任意元素。由于集合是无序的,因此无法确定哪个元素会被移除,因此 pop() 方法返回的元素是不确定的。
    my_set = {1, 2, 3, 4, 5}
    removed_element = my_set.pop()  # 移除并返回集合中的一个任意元素
    print(removed_element)  # Output: 1 或 2 或 3 或 4 或 5(不确定哪个元素被移除)
    print(my_set)           # Output: 剩下的元素(可能为 {2, 3, 4, 5} 等)
    
    • 注意:当集合为空时,调用 pop() 方法会引发 KeyError 异常,因为集合中没有元素可以被移除。在使用 pop() 方法前,请确保集合不为空或添加异常处理机制来处理空集合的情况。
  5. 集合运算:

    • 并集:使用union()方法或|操作符求两个集合的并集。
    • 交集:使用intersection()方法或&操作符求两个集合的交集。
    • 差集:使用difference()方法或-操作符求两个集合的差集。
    • 对称差集:使用symmetric_difference()方法或^操作符求两个集合的对称差集。
    set1 = {1, 2, 3}
    set2 = {3, 4, 5}
    union_set = set1.union(set2)            # 或者 union_set = set1 | set2
    intersection_set = set1.intersection(set2)  # 或者 intersection_set = set1 & set2
    difference_set = set1.difference(set2)  # 或者 difference_set = set1 - set2
    symmetric_difference_set = set1.symmetric_difference(set2)  # 或者 symmetric_difference_set = set1 ^ set2
    
  6. 判断子集和超集:

    • 使用issubset()方法或<=操作符判断一个集合是否是另一个集合的子集。
    • 使用issuperset()方法或>=操作符判断一个集合是否是另一个集合的超集。
    set1 = {1, 2}
    set2 = {1, 2, 3, 4}
    is_subset = set1.issubset(set2)      # 或者 is_subset = set1 <= set2
    is_superset = set2.issuperset(set1)  # 或者 is_superset = set2 >= set1
    
  7. 长度和清空集合:

    • 使用len()函数获取集合的长度(元素个数)。使用clear()方法清空集合中的所有元素。
    my_set = {1, 2, 3, 4}
    length = len(my_set)
    my_set.clear()
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/25677.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信小程序开发【从0到1~入门篇】2023.08

一个小程序主体部分由三个文件组成&#xff0c;必须放在项目的根目录&#xff0c;如下&#xff1a; 文件必须作用app.js是小程序逻辑app.json是小程序公告配置app.wxss否小程序公告样式表 3. 小程序项目结构 一个小程序页面由四个文件组成&#xff0c;分别是&#xff1a; 文…

Swintransformer模型的优化

SwinTransformer模型优化 文章目录 SwinTransformer模型优化1.SwinTransformer概述2.性能瓶颈分析3.模型优化3.1.transpose消除3.2.更好的layergroup3.1.1.SliceOp3.1.2.SqueezeOp3.1.3.weight切分 4.优化效果 1.SwinTransformer概述 自从Transformer在NLP任务上取得突破性的进…

20天突破英语四级高频词汇——第②天

2&#xfeff;0天突破英语四级高频词汇~第2天加油(ง •_•)ง&#x1f4aa; &#x1f433;博主&#xff1a;命运之光 &#x1f308;专栏&#xff1a;英语四级高频词汇速记 &#x1f30c;博主的其他文章&#xff1a;点击进入博主的主页 目录 2&#xfeff;0天突破英语四级高…

Bert详细学习及代码实现详解

BERT概述 BERT的全称是Bidirectional Encoder Representation from Transformers&#xff0c;即双向Transformer的Encoder&#xff0c;因为decoder是不能获要预测的信息的。在大型语料库&#xff08;Wikipedia BookCorpus&#xff09;上训练一个大型模型&#xff08;12 层到 …

【基础IO】文件系统 {磁盘的物理结构,存储结构,逻辑结构;CHS 和 LBA 寻址方式;磁盘分区和块组;文件inode;软硬链接}

文件系统 文件分为&#xff1a; 内存文件&#xff1a;被进程打开的文件&#xff0c;文件被加载到内存中供进程快速读写。磁盘文件&#xff1a;没有被打开的文件&#xff0c;保存在磁盘上。磁盘文件被分门别类的存储和管理&#xff0c;用于支持更好的存取。 提示&#xff1a; …

华为发布数字资产继承功能

在华为开发者大会2023&#xff08;HDC.Together&#xff09;上&#xff0c;华为常务董事、终端BG CEO、智能汽车解决方案BU CEO余承东正式发布了数字资产继承功能&#xff0c;HarmonyOS提供了安全便捷的数字资产继承路径。 在鸿蒙世界中&#xff0c;我们每个人在每台设备、应用…

复原 IP 地址——力扣93

文章目录 题目描述回溯题目描述 回溯 class Solution{public:static constexpr int seg_count=4<

第6集丨Vue 江湖 —— Class 与 Style 样式绑定

目录 一、class绑定1.1 字符串1.2 数组1.3 对象1.4 完整案例 二、style绑定2.1 案例2.2 效果 操作元素的 class 列表和内联样式是数据绑定的一个常见需求。因为它们都是 attribute&#xff0c;所以我们可以用 v-bind 处理它们&#xff1a;只需要通过表达式计算出字符串结果即可…

Typescript - 索引签名

目录 1&#xff0c;什么是索引签名1&#xff0c;js 中使用对象的属性2&#xff0c;ts 中的索引签名3&#xff0c;扩展索引签名定义的类型 2&#xff0c;与 Record 对比3&#xff0c;遇到的问题1&#xff0c;索引 key 的类型问题&#xff0c;keyof2&#xff0c;索引 key 的类型问…

uni-app:实现表格多选及数据获取

效果&#xff1a; 代码&#xff1a; <template><view><scroll-view scroll-x"true" style"overflow-x: scroll; white-space: nowrap;"><view class"table"><view class"table-tr"><view class&quo…

mysql高级三:sql性能优化+索引优化+慢查询日志

内容介绍 单表索引失效案例 0、思考题&#xff1a;如果把100万数据插入MYSQL &#xff0c;如何提高插入效率 &#xff08;1&#xff09;关闭自动提交&#xff0c;只手动提交一次 &#xff08;2&#xff09;删除除主键索引外其他索引 &#xff08;3&#xff09;拼写mysql可以执…

Typescript中的元组与数组的区别

Typescript中的元组与数组的区别 元组可以应用在经纬度这样明确固定长度和类型的场景下 //元组和数组类似&#xff0c;但是类型注解时会不一样//元组赋值的类型、位置、个数需要和定义的类型、位置、个数完全一致&#xff0c;不然会报错。 // 数组 某个位置的值可以是注解中的…

新能源电车交流充电桩控制主板的安全性维度

你是否想过&#xff0c;交流充电桩主板的安全性有多重要?它不仅关乎充电设备的寿命&#xff0c;还关乎电网的安全。今天我们就来探讨一下&#xff0c;如何从多个维度保证交流充电桩主板的安全性。 首先&#xff0c;交流充电桩主板采用多重安全保护技术&#xff0c;可以有效地保…

SM2算法的抗侧信道攻击

SM2 算法中底层模块抗侧信道 标量乘 ( [ k ] G [k]G [k]G) 运算过程中需要用到大量的倍点运算与点加运算。传统倍点运算与点加运算之间由于需要的运算次数不同&#xff0c;功耗存在明显区别&#xff0c;攻击者可以通过功耗波形特征分析密钥信息。传统算法如下图所示&#xff1a…

11. 使用tomcat中碰到的一些问题

文章目录 问题一&#xff1a;Tomcat的startup.bat启动后出现乱码问题二&#xff1a;一闪而退之端口占用问题三&#xff1a;非端口问题的一闪而退问题四&#xff1a;服务器的乱码和跨域问题问题五: 在tomcat\webapps\下创建文件夹为什么tomcat重启就会丢失问题六&#xff1a;Tom…

【C++】AVL(平衡二叉搜索树)树的原理及实现

文章目录 一、引言 二、AVL树的概念 三、AVL树的插入 3、1 AVL树的简单插入 3、2 旋转分类 3、2、1 新节点插入较高右子树的右侧&#xff1a;左单旋 3、2、2 新节点插入较高左子树的左侧&#xff1a;右单旋 3、2、3 新节点插入较高左子树的右侧&#xff1a;左右双旋&#xff08…

数据库执行新增时,字段写值错乱/字段值写反了 的问题

今天给表加了个字段&#xff0c;执行新增后查看表&#xff0c;发现数据库执行新增完成后&#xff0c;字段写值错乱了&#xff0c;表现为这两个字段的值写反了↓↓↓↓↓↓ 排查了xml中所有赋值的地方&#xff0c;全都没有问题 字段与属性的通用映射&#xff1a; <resultMap…

【已解决】Java 中使用 ES 高级客户端库 RestHighLevelClient 清理百万级规模历史数据

&#x1f389;工作中遇到这样一个需求场景&#xff1a;由于ES数据库中历史数据过多&#xff0c;占用太多的磁盘空间&#xff0c;需要定期地进行清理&#xff0c;在一定程度上可以释放磁盘空间&#xff0c;减轻磁盘空间压力。 &#x1f388;在经过调研之后发现&#xff0c;某服务…

编织人工智能:机器学习发展历史与关键技术全解析

文章目录 1. 引言1.1 机器学习的定义1.2 重要性和应用场景重要性应用场景 2. 机器学习的早期历史2.1 初期理论与算法感知机决策树 2.2 早期突破支持向量机神经网络初探 3. 21世纪初期的发展3.1 集成学习方法随机森林XGBoost 3.2 深度学习的崛起卷积神经网络&#xff08;CNN&…

css-4:元素水平垂直居中的方法有哪些?如果元素不定宽高呢?

1、背景 在开发中&#xff0c;经常遇到这个问题&#xff0c;即让某个元素的内容在水平和垂直方向上都居中&#xff0c;内容不仅限于文字&#xff0c;可能是图片或其他元素。 居中是一个非常基础但又是非常重要的应用场景&#xff0c;实现居中的方法存在很多&#xff0c;可以将这…