Python列表切片用法示例和细节

本文深入讲解了Python中列表、字符串和元组等有序序列的切片操作,详细解释了切片格式[start:end:step]的使用方法,包括起始索引、结束索引和步长的概念,以及正向和反向取值的规则。通过具体示例展示了如何灵活运用切片进行数据截取。

Python中符合序列的有序序列都支持切片(slice),例如列表,字符串,元组。

     格式:【start:end:step】

     start:起始索引,从0开始,-1表示结束

     end:结束索引

     step:步长,end-start,步长为正时,从左向右取值。步长为负时,反向取值

    注意切片的结果不包含结束索引,即不包含最后的一位,-1代表列表的最后一个位置索引,-2代表列表倒数第二个,以此类推

切记:一定不会包括 list[end] 这个位置的值,当 end为正时 则最后一位是 list[end-1] ,end为负数时, 则最后一位为 list[end+1],一定不会到达 list[end] 这一位置


示例:


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


b1=a[:] #省略全部,代表截取全部内容,可以用来将一个列表拷给另一个列表
print(b1)

结果:[1, 2, 3, 4, 5, 6]


b=a[0:-1:1] #从位置0开始到结束,每次增加1,截取。不包含结束索引位置(-1为最后一个元素索引位置)
print(b)

结果:[1, 2, 3, 4, 5]


c1=a[:3] #省略起始位置的索引,以及步长。默认起始位置从头开始,默认步长为1,结束位置索引为3
print(c1)

结果:[1, 2, 3]


c=a[0:5:3] #从第一个位置到第留给位置,每3个取一个值
print(c)

结果:[1, 4]


d=a[5:0:-1] #反向取值
print(d)

结果:[6, 5, 4, 3, 2]

关键:

真正让人迷惑的是list[start:stop:step]中的start和stop的默认值。

+:即从左向右看,所以start默认是0,stop默认是索引最大值

- :即从右向左看,所以start默认是索引最大值,stop默认是0

a = list(range(10))
print(a[5:0:-1])
print(a[5:4:-1])
print(a[:3:-1])  #没有指定,step为负数,start默认为索引最大值
print(a[0:3:-1]) #指定了0,则start从0开始
print(a[9::-1])  #stop没有指定,step为负数,那么stop默认为0

输出:

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

负数索引:

在 Python 中,负数索引用于从序列(如列表、元组或张量)的末尾开始计数。负数索引的理解方式如下:

  • -1 表示序列的最后一个元素。
  • -2 表示序列的倒数第二个元素。
a=[12,3,4,5,6,7,8]
c,d= a[-2:],a[:-2]
print(c)
print(d)

那么  分别输出的是 [7,8]  和  [12, 3, 4, 5, 6]

举一个复杂的例子 attention 计算的时候,

query_states 原始维度为 (4, L_q, D),假设 L_q = 500(即当前有 500 个 query token)

attn_weights = compute_attn(query_states[:, -window_size:, :], key_states, attention_mask)

  • query_states[:, -128:, :] → 对每个 batch 样本,选取第 500-128=372499 (含)这 128 个位置的 query 向量。

  • 切片后维度为 (4, 128, 768)

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值