第七章:序列

本文详细介绍了Python中的序列,特别是列表的使用。包括列表的创建、索引、切片、通用操作(如加号+和乘号*)、in和not in操作、min()和max()函数。此外,还探讨了如何修改列表、遍历列表、使用range()函数,以及各种列表方法如append(), insert(), extend(), clear(), pop(), remove(), reverse(), sort()等。" 110960120,10295292,大华7016平台主动注册调试:解决网络问题与验证码挑战,"['网络调试', '端口管理', '设备注册', '网络安全', '大华平台']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

01.序列简介

序列是Python当中最基本的数据结构
数据结构是什么?计算机中数据的存储方式

序列的分类:
1.可变序列 列表
2.不可变序列 str 元组

列表 : list
列表的作用
列表可以保存多个有序的数据

1.列表的创建

列表存储的数据,我们称之为元素

一个列表可以存多个数据,每个数据(元素)我们用逗号隔开

列表可以保存任意对象

lst = [1,2,3,4,5]    # 我们可以通过[]来创建列表  创建了一个空的列表
print(lst,type(lst))
》》》
[1, 2, 3, 4, 5] <class 'list'>

我们把元素放在序列(文具盒)里面,怎么把它取出来?

我们可以通过索引(index)来获取列表中的元素

索引是从0开始,列表第一个位置是0 第二个位置是1 。。。。。以此类推

如果超出最大索引值就会报错 ;IndexError: list index out of range

len()函数 获取列表的长度(列表中元素的个数)

获取到的列表的长度值;是列表的最大索引值+1

lst = [10,20,30,40,50]
print(lst[4])        # 该列表的最大索引值是:4
print(len(lst))     # 该列表的长度是:5 ——>  len(lst) = 4(最大索引值) + 1
》》》
50
5

列表的索引值可以为负数 如果索引值是负数 则从后向前获取元素 -1表示的是倒数第一个元素,-2表示的是倒数第二个元素。。。。。以此类推

lst = [10,20,30,40,50]
print(lst[-1])        #  50
print(lst[-2])       #  40
print(lst[-5])       #  10

02 - 列表切片

详细解释 一:

# 从现有列表获取一个子列表
#           0        1       2        3       4        5
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人','美国队长']
# 通过切片来获取列表当中指定的元素
# print(hero[0])   # 钢铁侠


# 语法 列表[起始:结束]
# 通过切片获取元素的时候,会包括起始位置的元素,但是不会包括结束位置的元素

# print(hero[0:3])      # ['钢铁侠', '绿巨人', '蜘蛛侠'] ----> [0,1,2]左闭右合,跟数学中的[0,2] 和 [0,3) 是一个意思


# 起始位置 和 结束位置 可不可以不写呢?
# 如果省略结束位置,则会从当前的开始位置一直截取到最后
print(hero[1:])   #  ['绿巨人', '蜘蛛侠', '黑寡妇', '蚁人', '美国队长']

# 如果省略开始位置,则会从第一个元素开始当前位置
print(hero[:3])  #  ['钢铁侠', '绿巨人', '蜘蛛侠']

# 如果把开始和结束位置同时省略掉,则会从第一个元素截取到最后一个元素
print(hero[:])    #  ['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人', '美国队长']

算法演练二:


#         0          1        2        3       5       6
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人','美国队长']
print(hero[0:3])  # ['钢铁侠', '绿巨人', '蜘蛛侠']  [0,2]->[0,1,2]

print(hero[:3])   # ['钢铁侠', '绿巨人', '蜘蛛侠']  # [0,1,2]
print(hero[:5])    #  ['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人'] [0,1,2,3,4]


print(hero[0:])    # ['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人', '美国队长']
                    # [0,1,2,3,4,5,]
print(hero[1:])     # ['绿巨人', '蜘蛛侠', '黑寡妇', '蚁人', '美国队长']
                    #  [1,2,3,,4,5]


print(hero[:])     # ['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人', '美国队长']
                    # [0,1,2,3,4,5]

步长:


#           0        1       2        3       4        5
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人','美国队长']

# 步长
# 语法 列表[起始:结束:步长]
# 步长表示,每次获取元素的间隔,默认是1(可以省略不写)
print(hero[:])  # ['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人', '美国队长']
print(hero[::2]) # ['钢铁侠', '蜘蛛侠', '蚁人']

# 步长不能为0   ValueError: slice step cannot be zero
# print(hero[::0])

# 步长可以为负数,如果是负数,则会像列表的后部向前边获取元素,也就是说从后往前取
print(hero[::-2])   #  ['美国队长', '黑寡妇', '绿巨人']

知识点补充:
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人','美国队长']
print(hero[0:6])
》》》
['钢铁侠', '绿巨人', '蜘蛛侠', '黑寡妇', '蚁人', '美国队长']

hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人','美国队长']
print(hero[0:0])
》》》
[]    # 空

03 - 通用操作

+ 和 *

加号可以将两个列表拼接成一个列表

my_list = [1,2,3] + [4,5,6] # [1,2,3,4,5,6]

*可以将列表重复指定的次数

my_list = [1,2,3] * 2 # [1,2,3,1,2,3]

in 和 not in

hero = [‘钢铁侠’,‘绿巨人’,‘蜘蛛侠’,‘黑寡妇’,‘蚁人’,‘美国队长’]

in 用来检查指定元素是否在列表当中,如果在,返回True;如果不在,返回False

print('绿巨人’in hero) # True

not in 用来检查制定元素是否不在列表当中,如果不在,返回True,如果在,返回False

print('葫芦娃’not in hero) # True

min() 和 max()

min()函数是获取列表当中的最小值
max()函数是获取列表当中的最大值
len()函数是获取列表当中元素个数的值

a = [10,2,3,4,55]
print(min(a),max(a)) # 2 55
print(len(a)) # 5

hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人','美国队长','蜘蛛侠','蜘蛛侠','蜘蛛侠']
# s.index()     **获取指定元素在列表当中的位置**
print(hero.index('蜘蛛侠'))   #  2

# s.count()  统计指定元素在列表当中出现的次数
print(hero.count('蜘蛛侠'))   #  4
print(hero.count('葫芦娃'))   #  0

04 - 修改列表

04-修改列表
hero = [‘钢铁侠’,‘绿巨人’,‘蜘蛛侠’,‘黑寡妇’,‘蚁人’,‘美国队长’]

hero[0] = [‘雷神’]
print(hero)

通过del来删除元素
del hero[2]
print(hero)

通过切片来修改元素
hero[0:3] = ‘abcde’ # [‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘黑寡妇’, ‘蚁人’, ‘美国队长’]
hero[0:3] = ‘123’ # [‘1’, ‘2’, ‘3’, ‘黑寡妇’, ‘蚁人’, ‘美国队长’]

hero[0:3] = 123 # TypeError: can only assign an iterable 给切片进行复制的时候必须传递一个序列

hero[0:3] = [‘黑豹’,‘灭霸’] # [‘黑豹’, ‘灭霸’, ‘黑寡妇’, ‘蚁人’, ‘美国队长’]
hero[0:6] = [‘黑豹’,‘灭霸’] #
print(hero)

l = hero[0:0]
print(l) # []

hero[0:0] = [‘雷神’] # 向索引值为0的位置插入元素
print(hero)
》》》
[‘雷神’, ‘钢铁侠’, ‘绿巨人’, ‘蜘蛛侠’, ‘黑寡妇’, ‘蚁人’, ‘美国队长’]


hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇','蚁人','美国队长']
# print(hero[::2])   #  ['钢铁侠', '蜘蛛侠', '蚁人']

# 当设置了步长,序列中元素的个数必须和切片重元素的个数保持一致
# hero[::2] = ['雷神','黑豹','灭霸']   #  ['雷神', '绿巨人', '黑豹', '黑寡妇', '灭霸', '美国队长']

# 通过切片来删除元素
# del hero[::2]   #   ['绿巨人', '黑寡妇', '美国队长']
# hero[1:3] = []  # ['钢铁侠', '黑寡妇', '蚁人', '美国队长']

# s = 'python'
# s[1] = 'j'
# print(s)  # 报错,改不了  # TypeError: 'str' object does not support item assignment

s = 'python'
s = list(s)
s[1] = 'j'
print(s)  #  ['p', 'j', 't', 'h', 'o', 'n']

05 - 列表的方法

hero = [‘钢铁侠’,‘绿巨人’,‘蜘蛛侠’]

1. s.append()

s.append() 向列表的最后添加一个元素
hero.append(‘黑寡妇’)
print() # [‘钢铁侠’, ‘绿巨人’, ‘蜘蛛侠’, ‘黑寡妇’]

2. s.insert()

s.insert() 向列表指定位置插入一个元素 参数 1.要插入的位置 2.要插入的元素
hero.insert(2,‘黑寡妇’)
print(hero) # [‘钢铁侠’, ‘绿巨人’, ‘黑寡妇’, ‘蜘蛛侠’]

3. s.extend()

s.extend 使用新的序列来扩展当前的序列
需要一个序列作为参数,它会将该序列中的元素添加到当前的序列当中
hero.extend([‘黑寡妇’,‘蚁人’]) # 相当于 hero += [‘黑寡妇’,‘蚁人’]
print(hero) # [‘钢铁侠’, ‘绿巨人’, ‘蜘蛛侠’, ‘黑寡妇’, ‘蚁人’]

4. s.append() 和 s.extend的区别

s.append 和 s.extend 看起来有些相似,但是区别在于 s.append 只能添加一个元素,而 s.extend 能添加一个序列

5. s.clear()

s.clear() 清空序列
hero.clear()
print(hero) # 打印出来是: []

6. s.pop()

s.pop() 可以根据索引值删除并返回指定的元素
a = hero.pop(1)
print(a) # 蜘蛛侠
print(hero) # [‘钢铁侠’, ‘绿巨人’]

如果不传递索引值就是删除最后一个元素
b = hero.pop()
print(b) # 蜘蛛侠
print(hero) # [‘钢铁侠’, ‘绿巨人’]

7. s.remove()

s.remove 删除指定值的元素
hero.remove(‘绿巨人’)
print(hero) # [‘钢铁侠’, ‘蜘蛛侠’]

8. s.reverse()

s.reverse() 用来翻转列表
hero.reverse()
print(hero) # [‘蜘蛛侠’, ‘绿巨人’, ‘钢铁侠’]

9. s.sort()

s.sort() 可以用来对列表当中的元素进行排序 (默认是升序的)
一般python中排序只会对数字字符串进行排序,对英文字符串进行排序的一般比较少,对中文基本上不进行排序
s.sort()是根据ASCII码表来进行排序的

(1)这个是排 ‘顺’ 序
my_list = list(‘ansdbasdat’)
my_list.sort() # [‘a’, ‘a’, ‘a’, ‘b’, ‘d’, ‘d’, ‘n’, ‘s’, ‘s’, ‘t’]
print(my_list)
(2) 这个是排 ’倒‘ 序
my_list = list(‘ansdbasdat’)
my_list.sort(reverse=True) # [‘t’, ‘s’, ‘s’, ‘n’, ‘d’, ‘d’, ‘b’, ‘a’, ‘a’, ‘a’]
print(my_list)

06. - 遍历列表

遍历列表 指的是将列表当中的元素取出来

hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇']

(1)
print(hero[0])      # 钢铁侠
print(hero[1])      # 绿巨人
print(hero[2])		#  蜘蛛侠
print(hero[3])		#  黑寡妇

 一般不这么写 (1)(2)
 (2)
i = 0
while i < len(hero):   # 用len()的好处是不管这个列表当中有多少个元素,我们都可                          
    print(hero[i])             以获取到,
    i += 1
》》》
钢铁侠
绿巨人
蜘蛛侠
黑寡妇

一般情况下我们是不通过while循环来遍历列表中的元素,我们通常使用的是 for 循环
语法: for 变量 in 序列(遍历的规则)
                代码块              
每执行一次就会将序列当中的一个元素赋值给变量 s
所以我们可以通过变量,来获取列表中的元素


 该列表中有几个元素,循环就会执行几次
hero = ['钢铁侠','绿巨人','蜘蛛侠','黑寡妇']
for s in hero:
    print(1)  # hero列表中有4个元素,这个循环就会执行4次


for s in hero:
    print(s)
    >>>
 钢铁侠
绿巨人
蜘蛛侠
黑寡妇

07. - range()函数

(1)start - stop:

range()函数 可以用来生成一个自然数的序列
start: 开始 默认从0开始(0可以省略)
stop: 结束 但是不包括结束 例如: range(0,5) ——> [0,1,2,3,4] 没有5

r = range(5) # 相当于 range(0,5)
print(list®) # [0,1,2,3,4]

(2)step:

step: 步长 默认为1 跟列表中的 步长 差不多
r = range(0,5,1)
print(list®) # [0, 1, 2, 3, 4]
r = range(0,10,2)
print(list®) # [0, 2, 4, 6, 8]

(3)for循环在range()函数-步长中的应用:

如果我想让一个 for 循环中的代码块执行指定的次数,那么我们就可以在range()函数里面的参数传递指定的次数

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

for i in range(0,9,2):

    print(lst[i])
    》》》
    1
3
5
7
9

08. - 练习

08 练习一 获取列表中所有的奇数

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

for i in range(0,9,2):

    print(lst[i])


练习二 找出100以内所有可以被3整除的数
方案一:
1. 定义一个空的列表  来接受结果
lst = []

# 2. 循环100个数
for i in range(1,101):

    # 3. 判断 可以被3整除的数:
    if i % 3 == 0:
        # 可以被3整除的数添加到列表中
        lst.append(i)

print(lst)
》》》
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

# 方案二:
print(list(range(3,101,3)))
》》》
[3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42, 45, 48, 51, 54, 57, 60, 63, 66, 69, 72, 75, 78, 81, 84, 87, 90, 93, 96, 99]

练习三:不通过函数的形式让列表实现翻转,并写出推导过程

练习三  现在有一列表 a = [1,2,3,4,5,6]  那么现在的要求是  不通过函数的形式让列表实现翻转,并写出推导过程

a = [1,2,3,4,5,6]

考点:对切片的另一种操作
a[::-1]  结论
a[0:4] [1,2,3,4]      切片
a[0:4:1] [1,2,3,4]   加上步长
a[0:4:2] [1.3]       步长为2

以上操作都是从左往右开始,步长为负就是从右往左开始
a[4:1:-1] [5,4,3]   步长为负
a[::-1] [6,5,4,3,2,1]  不使用切片  省略开始值  省略结束值
### RT-DETRv3 网络结构分析 RT-DETRv3 是一种基于 Transformer 的实时端到端目标检测算法,其核心在于通过引入分层密集正监督方法以及一系列创新性的训练策略,解决了传统 DETR 模型收敛慢和解码器训练不足的问题。以下是 RT-DETRv3 的主要网络结构特点: #### 1. **基于 CNN 的辅助分支** 为了增强编码器的特征表示能力,RT-DETRv3 引入了一个基于卷积神经网络 (CNN) 的辅助分支[^3]。这一分支提供了密集的监督信号,能够与原始解码器协同工作,从而提升整体性能。 ```python class AuxiliaryBranch(nn.Module): def __init__(self, in_channels, out_channels): super(AuxiliaryBranch, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1) self.bn = nn.BatchNorm2d(out_channels) def forward(self, x): return F.relu(self.bn(self.conv(x))) ``` 此部分的设计灵感来源于传统的 CNN 架构,例如 YOLO 系列中的 CSPNet 和 PAN 结构[^2],这些技术被用来优化特征提取效率并减少计算开销。 --- #### 2. **自注意力扰动学习策略** 为解决解码器训练不足的问题,RT-DETRv3 提出了一种名为 *self-att 扰动* 的新学习策略。这种策略通过对多个查询组中阳性样本的标签分配进行多样化处理,有效增加了阳例的数量,进而提高了模型的学习能力和泛化性能。 具体实现方式是在训练过程中动态调整注意力权重分布,确保更多的高质量查询可以与真实标注 (Ground Truth) 进行匹配。 --- #### 3. **共享权重解编码器分支** 除了上述改进外,RT-DETRv3 还引入了一个共享权重的解编码器分支,专门用于提供密集的正向监督信号。这一设计不仅简化了模型架构,还显著降低了参数量和推理时间,使其更适合实时应用需求。 ```python class SharedDecoderEncoder(nn.Module): def __init__(self, d_model, nhead, num_layers): super(SharedDecoderEncoder, self).__init__() decoder_layer = nn.TransformerDecoderLayer(d_model=d_model, nhead=nhead) self.decoder = nn.TransformerDecoder(decoder_layer, num_layers=num_layers) def forward(self, tgt, memory): return self.decoder(tgt=tgt, memory=memory) ``` 通过这种方式,RT-DETRv3 实现了高效的目标检测流程,在保持高精度的同时大幅缩短了推理延迟。 --- #### 4. **与其他模型的关系** 值得一提的是,RT-DETRv3 并未完全抛弃经典的 CNN 技术,而是将其与 Transformer 结合起来形成混合架构[^4]。例如,它采用了 YOLO 系列中的 RepNCSP 模块替代冗余的多尺度自注意力层,从而减少了不必要的计算负担。 此外,RT-DETRv3 还借鉴了 DETR 的一对一匹配策略,并在此基础上进行了优化,进一步提升了小目标检测的能力。 --- ### 总结 综上所述,RT-DETRv3 的网络结构主要包括以下几个关键组件:基于 CNN 的辅助分支、自注意力扰动学习策略、共享权重解编码器分支以及混合编码器设计。这些技术创新共同推动了实时目标检测领域的发展,使其在复杂场景下的表现更加出色。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值