数据结构

目录

1.字符串

1.1.字符串概念

1.2.字符串定义使用

1.3.索引

1.3.1.正向索引

1.3.2.反向索引

1.4.切片

1.5.字符串运算符

1.6.字符串格式化

1.7.字符串函数

2.列表

2.1.列表概念

2.2.列表索引、切片

2.3.列表运算符

2.4.列表函数

2.5.嵌套列表

3.元组

3.1.元组概念

3.2.元组索引、切片

3.3.元组函数

4.字典

4.1.字典概念

4.2.字典数据存储

4.3.字典定义元素

4.4.字典访问元素

4.5.字典修改元素

4.6.字典删除元素

4.7.字典函数

5.集合

5.1.集合概念

5.2.集合定义

5.3.集合函数


1.字符串

1.1.字符串概念

在计算机编程中,字符串是由字符组成的序列,用于表示文本或字符数据。字符串是一种常见的数据类型,用于存储和操作文本数据。

在大多数编程语言中,字符串被包含在引号(单引号或双引号或三引号)中(只有在 python 中单引号包起来的是字符串,其他语言中单引号包起来的是字符,有且仅有 1 个),例如: "Hello, World!" 或 'OpenAI Chatbot' 。字符串可以包含字母、数字、符号和空格等字符,可以是任意长度的序列。

字符串是不可变的,这意味着一旦创建了一个字符串,就无法修改它的内容。但是,可以通过字符串操作和方法 (函数) 来创建、连接、切片、搜索和修改(即:增、删、改、查)字符串。

1.2.字符串定义使用

1.3.索引

在计算机编程中,索引是用于访问数据结构(如字符串、列表、元组等)中元素的位置或标识符。索引允许我们根据元素在数据结构中的位置来检索、修改或操作它们。

数据本质上分为 3 大类:数字、文本(字符串)、时间。

字符串里可以写数字,可以写时间。

1.3.1.正向索引

正向索引是从左到右的索引方式,以从零开始递增的索引值。在正向索引中,第一个元素的索引为 0 ,第二个元素的索引为 1 ,依此类推。

终端输入命令:

vscode 安装插件:

新建以 .ipynb 为后缀的文件:

在 .ipynb 文件中可以同时编辑 2 种格式的代码:code、markdown。

对于 notebook 文件有 2 种模式:

**a.命令模式:**左边是蓝色的条。

命令模式下按 m 键会变为 markdown 格式文件:

执行:

方式一:按 a 键,在上方重新创建一个单元格。不运行。

方式二:按 b 键,在下方重新创建一个单元格。不运行。

**b.编辑模式:**整个框变为蓝色区域,并且有光标在闪。

执行:

方式一:

方式二:control + 回车

方式三:shift(mac 是向上的箭头) + 回车(运行当前单元格,运行后在下方重新创建一个单元格)

ctrl + 回车,执行:

1.3.2.反向索引

反向索引是从右到左的索引方式,以从 -1 开始递减的索引值。在反向索引中,最后一个元素的索引为 -1 ,倒数第二个元素的索引为 -2 ,依此类推。

1.4.切片

字符串切片是一种从字符串中获取子字符串的操作,它可以根据指定的起始位置和结束位置提取出字符串的一部分。切片操作可以用于获取字符串的子串,也可以用于复制字符串或反转字符串。

切片的开始索引、结束索引、步长都有默认值 (开始、结束的默认值由步长决定)

  • 开始 : 步长为正数 , 默认值是 0, 否则就是 -1。
  • 结束 : 步长为正数 , 默认值是字符长长度 , 否则就是负字符串长度 - 1。
  • 步长 : 默认值是 1。

要不都用正向索引,要不都用反向索引。

多行输出设置:

1.5.字符串运算符

1.6.字符串格式化

1.7.字符串函数

excel 中也有类似是 TRIM(text) 函数:

  • 删除字符串中多余的空格,但会在英文字符串中保留一个作为词与词之间分隔的空格。
  • text:要删除空格的字符串。

去掉指定文本左右的空白&中间空白会判断有没有特殊含义,若没有特殊含义也会去掉,有多个空白只会保留一个:

2.列表

2.1.列表概念

在计算机编程中,列表(List)是一种有序、可变的数据结构,用于存储多个元素。列表可以包含不同类型的元素,例如整数、浮点数、字符串、布尔

值、元组、字典、集合、列表等。列表是一种非常常见且灵活的数据结构,在几乎所有编程语言中都有相应的实现。列表使用方括号 [ ] 来表示,其中的元素用逗号 , 分隔。

2.2.列表索引、切片

参考字符串的索引和切片。

2.3.列表运算符

2.4.列表函数

python 复制代码
# notebook 中:
arr = [-66, 39, 72, 70, -10, -83, -53, -36, 35, 28]
arr.append(11)
arr

arr.index(11)

arr.pop() 

arr

arr.insert(0, 'lisi')
arr

arr.remove('lisi')
arr

arr2 = arr.copy()
arr3 = arr2
arr2

arr3

arr

arr.pop()

arr

arr2

arr3

arr.clear()
arr

arr2

arr3

2.5.嵌套列表

嵌套列表是指在一个列表中包含另一个或多个列表作为元素的数据结构。通过嵌套列表,可以创建多维的数据结构,其中每个内部列表可以具有不同的长度。

二维列表:

3.元组

3.1.元组概念

元组(Tuple)是 Python 中的一种有序、不可变的数据类型。它类似于列表,但具有不可变性,即一旦创建,就不能修改其元素。元组使用圆括号 () 表示,其中的元素可以是任意类型,并用逗号 , 分隔。

以下是一些元组的特点和用法:

  1. 不可变性:元组的元素不能被修改、添加或删除。一旦创建,元组的元素就是固定的。
  2. 有序性:元组中的元素按照它们的顺序排列,并可以通过索引来访问。
  3. 可以包含不同类型的元素:元组可以包含不同类型的元素,例如整数、字符串、列表等。
  4. 可迭代性:可以使用循环来遍历元组中的元素。

3.2.元组索引、切片

参考字符串的索引和切片。

3.3.元组函数

元组在某些情况下很有用,特别是当需要确保数据的不可变性时。例如,可以将元组用作字典的键,因为字典中的键必须是不可变类型。另外,元组还可以在函数返回多个值时使用。

4.字典

4.1.字典概念

字典( Dictionary )是 Python 中的一种无序、可变的数据类型,用于存储键 - 值(key-value)对。字典使用花括号 {} 表示,其中的每个键值对使用冒号 : 分隔,键和值之间使用逗号 , 分隔。

以下是一些字典的特点和用法:

  1. 无序性:字典中的键 - 值对没有固定的顺序,不像列表和元组是有序的。字典没有索引。
  2. 键的唯一性:字典中的键是唯一的,每个键只能对应一个值。如果对同一个键赋值多次,后面的值会覆盖前面的值。字典的键只能是不可变类型 (数字、元组、字符串)。
  3. 可变性:字典可以进行添加、修改和删除操作,可以根据需要动态地改变字典的内容。
  4. 可以包含不同类型的值:字典的值可以是任意类型,例如整数、字符串、列表、元组、字典等。
  5. 可迭代性:可以使用循环遍历字典中的键或值,也可以使用键来访问对应的值。(有索引叫循环,没索引叫迭代)。

4.2.字典数据存储

4.3.字典定义元素

注意,字典中的键通常是不可变的,例如字符串、数字或元组。这是因为字典内部使用哈希表来实现,而哈希表的键需要具有不可变性。而字典中的值可以是任意类型,可以是不可变类型或可变类型。

4.4.字典访问元素

字典可以使用键来获取值。

注意如果键不存在那么访问会报错。

4.5.字典修改元素

字典元素修改需要通过键对值进行修改 , 如果键不存在那就是添加功能。(不能修改键,只能修改值。)

4.6.字典删除元素

字典元素删除需要通过键对键值对进行删除 , 如果键不存在那么就会报错。

4.7.字典函数

python 复制代码
s = '''
《Dehors Dreams》
123451
In the quiet night, under a silver moon,
Dreams take their flight王大拿, and hearts(( )[]{ }) start to bloom.
张三、李四往外
Stars above shine(。) so bright, like diamonds in the night,
Guiding our path, in their gentle light.
Together we walk, hand in hand, through life's twist and turns,
With every step, our love just burns.
点号包括句号(。)、问号(?)、叹号(!)、逗号(,)、顿号(、)、分号(;)、冒号(:)。
标号包括引号(""' ')、括号(( )[]{ })、破折号(------)、省略号(......)、着重号(.)、连接号(---、~、-等)、间隔号(・)、书名号(《 》〈 〉)。
Let's make a promise🐔, here and now,
To cherish each moment, and never let it go.
With you😂, my love, there's no doubt,
Our hearts will stay young, forever🚀 in love's embrace.
'''.lower()
s
print(s)

# 循环字符串中的每一个字符
# 判断是否在 a - z 之间
# 如果在累积起来
# 如果累积成一个完整的单词把它放在字典里

# 定义变量保存单词的每一个字母
t = ''
# 定义字典保存单词和出现的次数
dict_ = {}
for i in s:
    if 'a' <= i <= 'z' or i == "'":
        t += i
    elif t != '':
        if dict_.get(t):
            dict_[t] += 1
        else:
            dict_[t] = 1
        t = ''
dict_
python 复制代码
s = '''
《Dehors Dreams》
123451
In the quiet night, under a silver moon,
Dreams take their flight王大拿, and hearts(( )[]{ }) start to bloom.
张三、李四往外
Stars above shine(。) so bright, like diamonds in the night,
Guiding our path, in their gentle light.
Together we walk, hand in hand, through life's twist and turns,
With every step, our love just burns.
点号包括句号(。)、问号(?)、叹号(!)、逗号(,)、顿号(、)、分号(;)、冒号(:)。
标号包括引号(""' ')、括号(( )[]{ })、破折号(------)、省略号(......)、着重号(.)、连接号(---、~、-等)、间隔号(・)、书名号(《 》〈 〉)。
Let's make a promise🐔, here and now,
To cherish each moment, and never let it go.
With you😂, my love, there's no doubt,
Our hearts will stay young, forever🚀 in love's embrace.
'''.lower()

t = ''

dict_ = {}

for i in s:
    if '一' <= i <= '龥':
        t += i
    elif t != '':
        if dict_.get(t):
            dict_[t] += 1
        else:
            dict_[t] = 1
        t = ''
dict_

5.集合

5.1.集合概念

在 Python 中,集合(Set)是一种无序且不重复的数据集合。它是由一组唯一元素组成,这些元素可以是任意的不可变类型,如整数、浮点数、字符串、元组等。集合是可变的,可以添加、删除和修改元素。

集合的特点如下:

  1. 无序性:集合中的元素没有特定的顺序,不能通过索引访问元素。
  2. 唯一性:集合中的元素是唯一的,不允许重复出现。
  3. 不可变性:集合的元素必须是不可变类型,如整数、字符串、元组等。

在 Python 中,可以使用大括号 {} 或者 set() 函数来创建一个集合。

5.2.集合定义

集合起变量名一样不能用:

重启内核:

先执行下边的(✅),再执行上边的(❌):

5.3.集合函数

python 复制代码
s = '''200
388
123
456
987
342
767
234
124
345
123
234'''

vals = [int(i) for i in s.split('\n')]
print(vals)

data = {i + 1 : vals[i] for i in range(len(vals))}
print(data)

# 输入正确的开始月份和结束月份
while 1:
    start = input('请输入开始月份:')
    if start.isdigit():
        start = int(start)
        if 1 <= start <= 12:
            break
        print('您输入的月份不合法')
    print('您输入的不是数字')
    pass

# 输入正确的结束月份和结束月份
while 1:
    end = input('请输入结束月份:')
    if end.isdigit():
        end = int(end)
        if start <= end <= 12:
            break
        print('您输入的月份不合法')
    print('您输入的不是数字')
    pass

# 计算平均访客量
sum_ = 0
for k in range(start, end + 1):
    sum_ += data[k]

avg_ = sum_ / (end - start + 1)

print(start if start == end else f'{start} ~ {end}', f'月平均访客量是:{avg_}', sep = '')
python 复制代码
# 输入工龄
while 1:
    n = input('请输入工龄:')
    if n.isdigit():
        n = int(n)
        if n >= 1:
            break
        print('输入的工龄不合法')

if n < 5:
    print('年假 1 天')
elif 5 <= n <= 10:
    print('年假 5 天')
else:
    print('年假 7 天')
python 复制代码
import random

# 定义一个集合保存红球
red_ball = set()

while len(red_ball) < 6:
    n = random.randint(1, 33)
    red_ball.add(n)

# 蓝球
blue_ball = random.randint(1, 16)

# 把集合转为列表
red_ball = list(red_ball)

red_ball = [f'0{i}' if i < 10 else f'{i}' for i in red_ball]

# 排序
red_ball.sort()
print(red_ball)

print(f'中奖号码是:\n红球:{red_ball}\n蓝球:{f"0{blue_ball}" if blue_ball < 10 else f"{blue_ball}"}')
python 复制代码
import random

# 定义一个集合保存红球
red_ball = set()

while len(red_ball) < 6:
    n = random.randint(1, 33)
    red_ball.add(n)

# 蓝球
blue_ball = random.randint(1, 16)

# 把集合转为列表
red_ball2 = list(red_ball)

red_ball2 = [f'0{i}' if i < 10 else f'{i}' for i in red_ball]

# 排序
red_ball2.sort()
print(red_ball)

print(f'中奖号码是:\n红球:{red_ball2}\n蓝球:{f"0{blue_ball}" if blue_ball < 10 else f"{blue_ball}"}')

# 输入中奖号
red_user_ball = set()

while len(red_user_ball) < 6:
    while 1:
        n = input(f'请输入第{len(red_user_ball) + 1}个红球:')
        if n.isdigit():
            n = int(n)
            if 1 <= n <= 33:
                break
            print('输入的范围不正确')
        else:
            print('输入的不是数字')

    red_user_ball.add(n)

while 1:
    blue_user_ball = input(f'请输入蓝球:')
    if blue_user_ball.isdigit():
        blue_user_ball = int(blue_user_ball)
        if 1 <= blue_user_ball <= 16:
            break
        print('输入的范围不正确')
    else:
        print('输入的不是数字')

# 计算中奖号码个数
blue_count = 1 if blue_user_ball == blue_ball else 0

red_count = len(red_ball.intersection(red_user_ball)) # 交集

if blue_count == 1 and red_count == 6:
    print(f'恭喜您中了一等奖,奖金浮动')
elif blue_count == 0 and red_count == 6:
    print(f'恭喜您中了二等奖,奖金浮动')
elif blue_count == 1 and red_count == 5:
    print(f'恭喜您中了三等奖,奖金 3000 元')
elif blue_count == 0 and red_count == 5 or blue_count == 1 and red_count == 4:
    print(f'恭喜您中了四等奖,奖金 200 元')
elif blue_count == 0 and red_count == 4 or blue_count == 1 and red_count == 3 :
    print(f'恭喜您中了五等奖,奖金 10 元')
elif blue_count == 1 and red_count == 2 or blue_count == 1 and red_count == 1 or blue_count == 1 and red_count == 0:
    print(f'恭喜您中了六等奖,奖金 5 元')
else:
    print('下次再来')
python 复制代码
# 联系人的信息
# 姓名
# 电话
# 邮箱
# 地址
# 需要把 4 条信息保存在字典中
# key: 姓名
# val: 其他

# 定义初始化的数据
data = {
    '泽': ['13012345678', 'qiuzemiao@163.com', '北京市海淀区'], 
    '海': ['13012345679', 'xinhaikuan@163.com', '北京市海淀区'], 
    '杰': ['13012345688', 'songyingjie@163.com', '北京市海淀区'], 
    '帅': ['13012345670', 'liushuai@163.com', '北京市海淀区'], 
}

while 1:
    msg = '1.添加联系人\n'\
        '2.查看联系人\n'\
        '3.修改联系人\n'\
        '4.删除联系人\n'\
        '0.退出\n'\
        '请选择:'
    
    while 1:
        n = input(msg)
        if n.isdigit():
            n = int(n)
            if 0 <= n <= 4:
                break
            print('输入的数字不在范围内')
        else:
            print('输入的不是数字')

    match n:
        case 0:
            break

        case 1:
            name = input('请输入联系人姓名:')
            if name not in data:
                phone = input('请输入电话:')
                email = input('请输入邮箱:')
                address = input('请输入地址:')
                data[name] = [phone, email, address]
                print('添加成功')
                pass
            else:
                print('联系人已存在')
            pass

        case 2:
            print('姓名\t电话\t\t邮箱\t\t\t地址')
            for k, v in data.items():
                print(f'{k}\t', '\t'.join(v), sep = '')
            pass

        case 3:
            a = ['电话', '邮箱', '地址']
            while 1:
                msg = '\n'.join([f'{i + 1}. 修改' + a[i] for i in range(len(a))]) + '\n请选择:'
                n = input(msg)
                if n.isdigit():
                    n = int(n)
                    if 0 <= n <= 3:
                        break
                    print('输入的数字不在范围内')
                else:
                    print('输入的不是数字')
            
            name = input('请输入姓名:')
            if name in data:
                data[name][n - 1] = input('请输入' + a[n - 1] + ': ')
                print('修改成功')
                pass
            else:
                print('联系人不存在')
            pass

        case 4:
            name = input('请输入姓名:')
            if name in data:
                data.pop(name)
                print('删除成功')
                pass
            else:
                print('联系人不存在')
            pass

    print('*' * 60)

# 在终端执行,control + c 是退出
相关推荐
叁散2 小时前
PTA--数据结构预习报告: 考试排名汇总
数据结构
是老余4 小时前
算法基础之链表:移除链表元素leetcode203
数据结构·算法·链表
不修×蝙蝠5 小时前
数据结构--二叉树的创建和遍历
java·数据结构·二叉树·深度遍历·广度遍历·迭代法·递归法
kitesxian5 小时前
Leetcode62. 不同路径(HOT100)
数据结构·算法·leetcode
立志成为master6 小时前
HBU算法设计第五章(回溯)
数据结构·c++·算法·dfs
橘子真甜~7 小时前
20. C++STL 6(详解list的使用,vector和list的比较和优缺点)
开发语言·数据结构·c++·list
要一杯卡布奇诺7 小时前
模拟实现单链表 —— SingleLinkedList
数据结构·算法
憶巷7 小时前
快速排序算法
数据结构·算法·排序算法
Heris997 小时前
零基础快速掌握——c语言基础【二维数组】
c语言·开发语言·数据结构·算法
武昌库里写JAVA8 小时前
SpringBoot
c语言·开发语言·数据结构·算法·二维数组