python中的sequence(序列)

【附注信息  ----> 关注公众号:CS阿吉,大家一起分享更多的技术文章,聊天技术问题。】

 

数据类型:sequence (序列)

1. sequence(序列)是一组有顺序元素集合

(严格的说,是对象的集合,但鉴于我们还没有引入“对象”概念,暂时说元素)

序列可以包含一个或多个元素,也可以是一个没有任何元素的空序列

元素可以是我们之前所说的基本数据类型,可以是另一个序列,还可以是我们以后介绍的其他对象。

序列有两种:tuple(定值表; 也有翻译为元组) 和 list ()

>>>s1 = (2, 1.3, 'love', 5.6, 9, 12, False) # s1是一个tuple

>>>s2 = [True, 5, 'smile']# s2是一个list

>>>print s1,type(s1)

>>>print s2,type(s2)

tuple和list的主要区别在于,一旦建立,tuple的各个元素不可再变更,而list的各个元素可以再变更

一个序列作为另一个序列的元素

>>>s3 = [1,[3,4,5]]

空序列

>>>s4 = []

 

2. 序列元素的引用:

序列元素的下标从0开始:

>>>print s1[0]

>>>print s2[2]

>>>print s3[1][2]

由于list的元素可变更,你可以对list的某个元素赋值:

>>>s2[1] = 3.0

>>>print s2

如果你对tuple做这样的操作,会得到错误提示。

所以,可以看到,序列的引用通过s[<int>]实现, int为下标

3)其他的引用方式:

范围引用: 基本样式[下限:上限:步长]

>>>print s1[:5] # 从开始到下标4 (下标5的元素 不包括在内)

>>>print s1[2:]# 从下标2到最后

>>>print s1[0:5:2]# 从下标0到下标4 (下标5不包括在内),每隔2取一个元素 (下标为0,2,4的元素)

>>>print s1[2:0:-1]# 从下标2到下标1

从上面可以看到,在范围引用的时候,如果写明上限,那么这个上限本身不包括在内

尾部元素引用

>>>print s1[-1]# 序列最后一个元素

>>>print s1[-3]# 序列倒数第三个元素

同样,如果s1[0:-1], 那么最后一个元素不会被引用 (再一次,不包括上限元素本身

4) 字符串是一种tuple

因此也就可以做tuple可以进行的操作

>>>str = 'abcdef'

>>>print str[2:4]

 

总结:

tuple元素不可变,list元素可变

序列的引用 s[2], s[1:8:2]

字符串是一种tuple

 

来测试一下python中的序列

 

[python]  view plain  copy
 
 
  1. seq='hello world!'#这是一个tuple  
  2. seq1=[1,1.3,True,'hello',[1,1.2,True,'xxx']]#list嵌套  
  3. seq2=(1,1.3,True,'hello',[1,1.2,True,'xxx'])#tuple中嵌套list  
  4. seq3=[1,1.3,True,'hello',(1,1.2,True,'xxx')]#list中嵌套tuple  
  5. seq4=(1,1.3,True,'hello',(1,1.2,True,'xxx'))#tuple嵌套  


1.python中的序列中竟然可以含有不同类型的元素,c++中的数组、vector、list、deque、set、map的容器都做不到这一点。

 

2.python中的序列可以方便的取值

 

[python]  view plain  copy
 
 
  1. ##有关取值操作符  
  2.   
  3. print("seq[2]=%s\nseq1[4]=%s\nseq2[4]=%s\nseq3[4]=%s\n"%(seq[2],seq1[4],seq2[4],seq3[4]))  
  4. ##seq[m,n]输出的只有m到n-1。相当于是个半开半闭区间  
  5.   
  6. print("seq[2:4]=%s\nseq1[2:4]=%s\nseq2[2:4]=%s\nseq3[2:4]=%s\n"%(seq[2:4],seq1[2:4],seq2[2:4],seq3[2:4]))  


输出:

 

>>> ================================ RESTART ================================
>>> 
seq[2]=l
seq1[4]=[1, 1.2, True, 'xxx']
seq2[4]=[1, 1.2, True, 'xxx']
seq3[4]=(1, 1.2, True, 'xxx')


seq[2:4]=ll
seq1[2:4]=[True, 'hello']
seq2[2:4]=(True, 'hello')
seq3[2:4]=[True, 'hello']

 

3.tuple和list的主要区别在于,一旦建立,tuple的各个元素不可再变更,而list的各个元素可以再变更。

 

[python]  view plain  copy
 
 
  1. #seq算是一个tuple。如果要修改里面的元素值,例如seq[2]='x'  
  2.   
  3. ''''' 
  4. 很悲惨的出现下面的错误 
  5. Traceback (most recent call last): 
  6.   File "J:\pythonexercise\seq.py", line 15, in <module> 
  7.     seq[2]='x' 
  8. TypeError: 'str' object does not support item assignment 
  9.  
  10. '''  
  11. #seq1算是一个list。元素是可以修改的  
  12. seq1[0]='I can change the cell in list'  
  13. seq1[4]='change list to string'  
  14.   
  15. print seq1  
  16.   
  17. 输出为  
  18. ['I can change the cell in list'1.3True'hello''change list to string']  
  19.   
  20. #seq2是一个tuple,所以它不能被修改  
  21. #seq2[0]='I can change the cell in list'  
  22. ''''' 
  23. 很悲惨的出现下面的错误 
  24. Traceback (most recent call last): 
  25.   File "J:\pythonexercise\seq.py", line 33, in <module> 
  26.     seq2[0]='I can change the cell in list' 
  27. TypeError: 'tuple' object does not support item assignment 
  28. '''  
  29. ##但是下面这句话竟然执行成功了。seq2[4]是一个list。所以seq2[4]中的元素可以被修改。  
  30. ##这就比较蛋疼了,tuple不能被修改,但是tuple中嵌套的list可以被修改。⊙﹏⊙b汗!  
  31. seq2[4][2]='change list to string'  
  32. print seq2  

4.tuple也不是那么不可变

>>> t1=(1,'zzzz')
>>> t2=[1,'zzzaaa']
>>> t1=t1+(1.23,True,[0,1])
>>> t1
(1, 'zzzz', 1.23, True, [0, 1])
>>> t1=t1+t2


Traceback (most recent call last):
  File "<pyshell#4>", line 1, in <module>
    t1=t1+t2
TypeError: can only concatenate tuple (not "list") to tuple
>>> t2=t2+[1.23,True,[0,1]]
>>> t2
[1, 'zzzaaa', 1.23, True, [0, 1]]
>>> 

可以看到,list和tuple不能连接。tuple在连接操作后值变化了

>>> t1=(1,'zzzz')
>>> t1=t1*2
>>> t1
(1, 'zzzz', 1, 'zzzz')

对于*重复操作符也可以修改tuple的值。

<think> 我们之前讨论的是Python序列切片。用户要求了解切片的使用方法和相关知识。 根据系统指令,我们需要: 1. 行内数学公式用$...$,但这里可能不需要数学公式,除非涉及索引计算。 2. 独立公式用$$...$$,但同样可能不需要。 3. 使用中文回答。 4. 生成相关问题。 5. 回答中引用段落末尾添加引用标识(但这里没有引用来源,可以省略,除非我们引用官方文档之类的,但题目没有提供,所以暂时不加引用标识)。 回答结构: 1. 介绍切片的基本概念和语法。 2. 详细说明切片的参数(start, stop, step)及其默认值。 3. 举例说明切片操作,包括正索引和负索引的使用。 4. 说明切片操作是浅拷贝。 5. 提及切片的高级用法(如步长为负数时反转序列等)。 6. 最后生成相关问题。 注意:由于是序列切片,可以适用于字符串、列表、元组等。 示例代码使用行内代码标记(不用代码块,因为系统指令没有要求代码块,但为了清晰,我们可以用代码块,因为用户问题中示例有代码块。系统指令要求独立公式用$$,但代码是代码块,我们可以用```标记,但指令没有明确规定代码块,不过示例中使用了代码块,所以我们也可以使用。 但是系统级指令中要求独立公式用$$...$$,代码块在示例中是单独用```...```,所以我们可以用代码块。 我们将按照以下结构: ### Python序列切片 (介绍) #### 基本语法 ```python sequence[start:stop:step] ``` #### 参数说明 - start:起始索引(包含),默认为0 - stop:结束索引(不包含),默认为序列长度 - step:步长,默认为1 (详细解释和示例) #### 示例 (多个例子) #### 注意事项 (浅拷贝,负数索引等) §§相关问题§§ 1. ... 2. ... 3. ... 现在开始组织内容。 </think> ### Python序列切片详解 序列切片是Python中处理有序集合(如列表、元组、字符串)的核心技术,通过简洁的语法实现子序列的高效提取。基本语法为: ```python sequence[start:stop:step] ``` #### 核心参数解析 1. **起始位置(start)** - 从0开始计算的索引位置(包含该元素) - 默认值:0(从序列开头开始) - 示例:`"Python"[1:] → "ython"` # 从索引1开始到结尾 2. **结束位置(stop)** - 切片结束的索引位置(不包含该元素) - 默认值:序列长度(切片到结尾) - 示例:`[10,20,30,40][:2] → [10,20]` # 取索引0-1 3. **步长(step)** - 元素选取间隔,可为负数实现反向切片 - 默认值:1(连续选取) - 示例:`"algorithm"[::2] → "ahrm"` # 隔一个取一个 #### 进阶用法 ```python # 负数索引(从末尾计算) nums = [0,1,2,3,4,5] print(nums[-3:]) # [3,4,5] 最后三个元素 # 反向切片 text = "Python" print(text[::-1]) # "nohtyP" 字符串反转 # 多维切片(NumPy等库支持) import numpy as np arr = np.array([[1,2,3],[4,5,6]]) print(arr[:, 1:]) # 所有行的第1列之后 [[2,3],[5,6]] ``` #### 关键特性 1. **浅拷贝机制** 切片操作创建新对象,但元素为原始对象的引用: ```python original = [[1,2], [3,4]] sliced = original[:] sliced[0][0] = 99 print(original) # [[99,2], [3,4]] 内层列表被修改 ``` 2. **越界保护** 自动处理超出范围的索引: ```python "Python"[2:20] → "thon" # 超过长度时截断到末尾 ``` 3. **空切片条件** 当`start`和`stop`相等或逆序步长时返回空序列: ```python [1,2,3][5:] → [] # 起始位置超过长度 ``` #### 性能优化 切片时间复杂度为$O(k)$(k为结果序列长度),对大型序列推荐: ```python # 代替循环遍历 with open("data.txt") as f: header = f.readlines()[:10] # 仅读取前10行 # 生成器切片(itertools.islice) from itertools import islice gen = (x**2 for x in range(1000000)) first_100 = list(islice(gen, 100)) # 不加载全部数据 ```
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值