列表與元組
通用序列操作
索引 、分片、序列相加、乘法、成員資格、長度、最小值和最大值
索引 indexing
索引0指向第一個元素,索引1指向第二個元素……
**(負(fù)數(shù)索引)**python的序列也可以從右邊開始索引,最右邊的元素索引是-1
分片 slicing
索引是對單個元素進(jìn)行訪問,**分片訪問一定范圍內(nèi)的元素**
分片操作既支持正數(shù)索引也支持負(fù)數(shù)索引
**第一個索引的元素包含在分片內(nèi),第二個索引的元素不包含在分片內(nèi)**
```python
>>> number = [1,2,3,4,5,67,8,9,10]
>>> number[1:3] # 取索引為第一和第二的元素
[2, 3]
>>> number[-3:-1] # 取倒數(shù)第二和倒數(shù)第三的元素
[8, 9]
>>> number[-3:] # 取最后三個元素
[8, 9, 10]
>>> number[0:3] # 取前三個元素
[1, 2, 3]
>>> number[0::2] # 步長為2
[1, 3, 5, 8, 10]
>>> number[10:0:-2] # 步長可以為負(fù) 第二個索引為0 取不到第1個元素
[10, 8, 5, 3]
對于正數(shù)步長,python會從序列頭部開始向右提取元素,直到最后一個元素(分片中);對于負(fù)數(shù)步長,python則是從序列尾部開始向左提取元素,直到第一個元素(分片中)
```
序列相加
使用加號 '+ ' 可以進(jìn)行序列的連接操作
>>> [1,2,3] + [4,5,6] # 數(shù)字序列相加
[1, 2, 3, 4, 5, 6]
>>> 'hello,' + 'world' # 字符串序列相加
'hello,world'
>>> [1,2,3] + 'hello' # 字符串序列與數(shù)字序列相加 (發(fā)生錯誤)
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
[1,2,3] + 'hello' # 字符串序列與數(shù)字序列相加 (發(fā)生錯誤)
TypeError: can only concatenate list (not "str") to list
只有類型相同的序列才能通過加號進(jìn)行序列連接操作,不同類型的序列不能通過加號連
乘法
序列中的乘法:一個數(shù)字n乘以一個序列會生成一個新的序列,新的序列是將原來的序列重復(fù) n次
```python
>>> 'hello'* 5
'hellohellohellohellohello'
>>> [3] * 5
[3, 3, 3, 3, 3]
```
? python中序列的乘法可以幫助我們快速做一些初始化操作(重復(fù)操作,空列表和None)
? python ? >>> sq = [None] * 5 # 初始化sq為含有5個None的序列 ? None是 python 的內(nèi)建值 表示這里什么都沒有 ? >>> sq ? [None, None, None, None, None] ?
成員資格
in 運(yùn)算符用來檢查一個值是否在序列中,在返回True、不在返回False
>>> str = 'hello'
>>> 'e' in str
True
>>> 'a' in str
False
>>> users = ['xiaoming','xiaozhang','xiaozhu']
>>> 'xiaoming' in users # 檢測字符串是否在字符串列表中
True
>>> 1 in users # 數(shù)字類型不能在字符串類型中通過in 進(jìn)行成員檢測
SyntaxError: unexpected indent
>>> 1 in [1,2,3]
True
>>> '1' in [1,2,3] # 字符串類型類可以在數(shù)字列表中通過in 進(jìn)行成員資格檢測
False
長度、最小值和最大值
python 提供了長度、最小值和最大值的內(nèi)建函數(shù),分別為len、min和max
>>> numbers = [200,300,500]
>>> len(numbers) # 長度
3
>>> min(numbers) # 最小值
200
>>> max(numbers) # 最大值
500
列表
列表的內(nèi)容是可變的
更新列表
序列中的操作,如索引、分片、序列相加和乘法都適用與列表
除此之外列表中還有其他方法用來更新列表(元素賦值、元素刪除、分片賦值和列表方法)
-
元素賦值
賦值語句是最簡單改變列表的方法>>> a = [1,2,3,4] >>> a[1] = 10 >>> a [1, 10, 3, 4] >>> a[3] = 100 # 改變了第4個元素的值 >>> a [1, 10, 3, 100] >>> a[2] = 'hello' # 對一個列表中的元素賦不同類型的值 >>> a [1, 10, 'hello', 100] >>> a[5] = 5 # 不能為一個不存在元素位置賦值 列表a的長度為4 5超出了列表范圍 Traceback (most recent call last): File "<pyshell#35>", line 1, in <module> a[5] = 5 # 不能為一個不存在元素位置賦值 IndexError: list assignment index out of range對一個列表中的元素賦不同類型的值
不能為一個不存在元素位置賦值 -
增加元素 append
在列表末尾添加新對象list.append(obj) 直接修改列表在其尾部添加一個元素 無返回值>>> num = [1,2,3] >>> num [1, 2, 3] >>> num.append(4) # 添加 4 >>> num [1, 2, 3, 4] >>> num.append('hello') # 添加一個字符串 >>> num [1, 2, 3, 4, 'hello'] -
刪除元素 del
使用del list[num] num是要刪除的列表元素索引>>> num = ['a','b','c','d'] >>> len(num) 4 >>> del num[0] # 刪除第一個元素 ‘a(chǎn)' >>> num ['b', 'c', 'd'] >>> len(num) 3 >>> del num[-1] # 刪除最后一個元素 >>> num ['b', 'c'] -
分片賦值
list()函數(shù):將序列直接轉(zhuǎn)換成列表>>> show = list('湖人隊總冠軍') >>> show ['湖', '人', '隊', '總', '冠', '軍'] >>> show[0:2] = list('熱火隊') # 分片賦值 >>> show ['熱', '火', '隊', '隊', '總', '冠', '軍'] >>> greeting = list('hi') >>> greeting ['h', 'i'] >>> greeting[1:] = list('ello') #使用與原序列不等長的序列將分片替換 >>> greeting ['h', 'e', 'l', 'l', 'o'] >>> boil = list('女排奪冠了') >>> boil ['女', '排', '奪', '冠', '了'] >>> boil[2:2] = list('2016年奧運(yùn)會') #不替換任何元素在任意位置插入新元素 >>> boil ['女', '排', '2', '0', '1', '6', '年', '奧', '運(yùn)', '會', '奪', '冠', '了'] >>> boil[2:10] = list() #對序列中任意位置的元素進(jìn)行刪除 >>> boil ['女', '排', '奪', '冠', '了']
嵌套列表
列表中可以嵌套列表,嵌套的列表取出來還是列表
>>> num = [1,2,3]
>>> num
[1, 2, 3]
>>> str = list('abc')
>>> str
['a', 'b', 'c']
>>> mix = [num,str]
>>> mix
[[1, 2, 3], ['a', 'b', 'c']]
>>> mix[1]
['a', 'b', 'c']
>>> mix[0]
[1, 2, 3]
>>>
列表方法
方法是與對象有緊密聯(lián)系的函數(shù)
調(diào)用語法: 對象.方法(參數(shù))
常用方法:
- append 在列表末尾添加新元素
使用方法: list.append(obj) 無返回值 - count 統(tǒng)計某個元素在在列表中出現(xiàn)的次數(shù)
使用方法: list.count(obj) - extend 在列表末尾一次性追加另一個序列的多個值
使用方法: list.extend(seq) seq代表元素列表
>>> a = ['hello','world']
>>> b = ['python','is','funny']
>>> a.extend(b)
>>> a
['hello', 'world', 'python', 'is', 'funny']
- index 從列表中找出某個值第一個匹配項的索引位置
使用方法: list.index(obj) obj表示要查找的對象 - insert 向列表指定位置插入一個元素
使用方法:list.insert(index,obj) index插入的位置 obj插入的元素 - pop 移除列表中的一個元素(默認(rèn)是最后一個元素),并返回該元素的值
使用方法:list.pop(num) num是可選參數(shù),代表要移除列表的對象
**使用pop方法可以實現(xiàn)棧(后進(jìn)先出) - remove 移除列表中某一個值的第一個匹配項
使用方法:list.remove(obj) - reverse 反向列表元素
使用方法:list.reverse() 無需參數(shù)
擴(kuò)展:如果需要反向一個序列可以使用 reversed函數(shù)
>>> num = [11,2,3]
>>> print('使用reversed函數(shù)翻轉(zhuǎn)結(jié)果:',list(reversed(num)))
使用reversed函數(shù)翻轉(zhuǎn)結(jié)果: [3, 2, 11]
- sort 對原列表進(jìn)行排序,可以指定參數(shù) ,默認(rèn)按升序排列
**sort方法改變了原來的列表而不是返回一個已排序過的列表 **
>>> num = [1,5,3,7]
>>> n = num.sort()
>>> print('變量n的結(jié)果是:',n)
變量n的結(jié)果是: None
>>> print('列表num排序的結(jié)果:',num)
列表num排序的結(jié)果: [1, 3, 5, 7]
sort方法修改了列表num,但返回的是空值,所以n的值是None
若不將原列表分片后賦值給另一個變量,兩個列表都會被排序
sort有一個對應(yīng)的函數(shù)sorted,可以直接獲取列表的副本進(jìn)行排序
>>> num = [5,8,1,3,6]
>>> n = sorted(num)
>>> print('變量n的結(jié)果是:',n)
變量n的結(jié)果是: [1, 3, 5, 6, 8]
>>> print('num的結(jié)果是:',num)
num的結(jié)果是: [5, 8, 1, 3, 6]
sort方法有兩個可選參數(shù)key和reverse(逆序)
>>> field = ['study','python','is','happy']
>>> field
['study', 'python', 'is', 'happy']
>>> field.sort(key=len,reverse=True)
>>> field.sort(key=len,reverse=True) #按字符串長度降序排序
>>> field
['python', 'study', 'happy', 'is']
- clear 清空列表
使用方法:list.clear()
>>> field
['python', 'study', 'happy', 'is']
>>> field.clear()
>>> field
[]
- copy 復(fù)制列表
使用方法:list.copy()
>>> field = ['python','is','study','is']
>>> field_copy = field.copy()
>>> field_copy
['python', 'is', 'study', 'is']
>>> field_copy1=field[:] # 類似效果
>>> field_copy1
['python', 'is', 'study', 'is']
元組
元組與列表類似,不同的是元組的元素不能修改(字符串也是不能修改的)
元組的創(chuàng)建
- 使用逗號分隔
- 圓括號
- tuple函數(shù)
tuple函數(shù)將參數(shù)(一個序列)轉(zhuǎn)換成元組,與list類似(轉(zhuǎn)換成列表)
>>> 1,2,3,4 # 使用逗號分隔
(1, 2, 3, 4)
>>> (1,2,3,4) # 是用圓括號
(1, 2, 3, 4)
>>> tuple(['hello','world']) # tuple函數(shù) 參數(shù)是列表
('hello', 'world')
>>> tuple('hello') #tuple函數(shù) 參數(shù)是字符串
('h', 'e', 'l', 'l', 'o')
>>> tuple(('hello','world')) #tuple函數(shù) 參數(shù)是元組
('hello', 'world')
注意:創(chuàng)建包含一個值的元組
>>> 1
1
>>> (1)
1
>>> (1,) # 需要加上逗號
(1,)
>>> 1, # 需要加上逗號
(1,)
>>> tuple('1')
('1',)
>>> tuple('1',)
('1',)
創(chuàng)建只包含一個值的元組需要加上逗號(利用tulpe函數(shù)除外)
元組的基本操作
訪問元組、修改元組、刪除元組、索引、截取……
- 訪問元組
使用下標(biāo)索引訪問
>>> num = (1,2,3,4)
>>> print('num[1]:',num[1])
num[1]: 2
>>> num = 1,2,3,4,5,6,7
>>> num
(1, 2, 3, 4, 5, 6, 7)
>>> print('num[1:5]:',num[1:5])
num[1:5]: (2, 3, 4, 5)
- 修改元組
元組中元素的只是不能被修改的,但可以元組進(jìn)行連接組合
>>> num=1,2,3
>>> field=('hello','world')
>>> num
(1, 2, 3)
>>> field
('hello', 'world')
>>> num+field
(1, 2, 3, 'hello', 'world')
- 刪除元組
元組中的元素值不允許被刪除,但可以使用del語句刪除整個元組
>>> field
(1, 2, 3, 'hello', 'world')
>>> del field
>>> print('刪除后的結(jié)果:',field)
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
print('刪除后的結(jié)果:',field)
NameError: name 'field' is not defined
元組field被del后輸出會報錯(field沒有被定義)
- 元組索引、截取
元組也是序列,所以可以訪問元組中指定位置的元素,也可以截取索引中的一段元素
>>> num
(1, 2, 3)
>>> num[2]
3
>>> num[-1]
3
>>> num[:]
(1, 2, 3)
- 元組內(nèi)置函數(shù)
計算元素個數(shù)len、返回最大值max、最小值min、列表轉(zhuǎn)換tuple
元組和列表的區(qū)別 區(qū)別
列表和元組的區(qū)別在于元組不能修改,元組一旦初始化就不能修改
元組不可變所以元組更加安全
>>> t = ('a','b',['A','B']) #定義一個元組并初始化
>>> t
('a', 'b', ['A', 'B'])
>>> t[2][0]='X'
>>> t[2][1]='Y'
>>> t
('a', 'b', ['X', 'Y']) # 發(fā)現(xiàn)元組“被修改”
>>> t[2].append('G')
>>> t
('a', 'b', ['X', 'Y', 'G'])
表面上看元組發(fā)生了變化,其實變得不是元組的元素、變得是list的列表。元組開始指向list列表沒有改變成別的list列表,故元組的不變是指每個元素的指向是不變的,例如上面的程序t[2]是指向一個list列表的,不能指向其他對象,但是指向的list列表是可變的