1. 程式人生 > >[Python]第二章 列表和元組

[Python]第二章 列表和元組

文章目錄


資料結構:資料結構是以某種方式(如通過編號)組合起來的資料元素(如數、字元乃至其他資料結構)集合。
序列:基本資料結構,序列中的每個元素都有編號,即位置或索引,第一個元素的索引為0。

  • 序列–列表和元組
  • 對映-- 字典(詳見第四章)
  • 集合-- set(詳見第十章)

2.1 序列概述(列表和元組)

不同在於,列表是可以修改的,而元組不可以。
序列 列表名=[元素1,元素2… …] 元組名=(元素1,元素2… …)

>>> edward = ['Edward Gumby', 42]
>>> type(a)
<classlist>

序列還可包含其他序列

>>> john = ['John Smith', 50]
>>> database = [edward, john]
>>> database
[['Edward Gumby', 42], ['John Smith', 50]]

2.2 通用的序列操作

2.2.1 索引 序列名[索引號] 訪問單個元素

字串就是由字元組成的序列。序列中的所有元素都有編號——從0開始遞增。

>>> greeting = 'Hello'
>>> greeting[0]
'H'

-1是最後一個元素的位置

>>> greeting[-1]
'o'

對於字串字面量(以及其他序列字面量),可直接對其執行索引操作,無需先將其賦變數。

>>> 'Hello'[1]
'e'
>>> fourth = input('Year: ')[3]
Year: 2005
>>> fourth
'5'

列表相加+相乘*(見下文)

>>>Fruits=['apple','peach']+5*['pear']+['orange']
>>>Fruits
['apple','peach','pear','pear','pear', 'pear','pear','orange']

CASE:輸出英文格式的日期
在這裡插入圖片描述
在這裡插入圖片描述
在這裡插入圖片描述

2.2.2 切片——列表名[起始位置含:結束位置不含]

訪問特定範圍內的元素

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[3:6]
[4, 5, 6]

索引負數-n代表倒著數第n位數

>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[3:-4]
[4, 5, 6]
1、絕妙的簡寫

從起始位置到最尾——列表名[起始位置含:]

>>> numbers[7:]
[8, 9, 10]

倒著數方法

>>> numbers[-3:]
[8, 9, 10]

從頭到截止位置——列表名[:結束位置不含]

>>> numbers[:3]  
[1, 2, 3]

複製整個序列

>>> numbers[:]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

CASE:擷取欄位
在這裡插入圖片描述

2、 更大的步長——列表名[起始位置含:結束位置不含:步長]
>>> numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> numbers[0:10:2]
[1, 3, 5, 7, 9]
>>> numbers[::4]
[1, 5, 9]

步長是負數,表示從右往左提取

>>> numbers[::-2]
[10, 8, 6, 4, 2]

2.2.3 序列相加

>>> [1, 2, 3] + [4, 5, 6]
[1, 2, 3, 4, 5, 6]
>>> 'Hello,' + 'world!'
'Hello,world!'
>>> [1, 2, 3] +[‘world’]
[1, 2, 3, ‘world’]

但是,不同的型別序列不能拼接

>>> [1, 2, 3] + 'world!'   #報錯
>>> [1, 2, 3] + (1,2,3)   # 報錯

2.2.4 乘法

>>> 'python' * 5
'pythonpythonpythonpythonpython'
>>> [42] * 10
[42, 42, 42, 42, 42, 42, 42, 42, 42, 42]

None、空列表和初始化

>>> sequence = [None] * 10
>>> sequence
[None, None, None, None, None, None, None, None, None, None]

CASE:列印方框
在這裡插入圖片描述
在這裡插入圖片描述

2.2.5 成員資格

要檢查特定的值是否包含在序列中,可使用運算子in。布林運算子,返回布林值。

>>> permissions = 'rw'
>>> 'w' in permissions
True
>>> 'x' in permissions
False
>>> users = ['mlh', 'foo', 'bar']
>>> input('Enter your user name: ') in users
Enter your user name: mlh
True
>>>A=[['as',12],['d',14]]
>>>s=['as',12]
>>>s in A
True

現在可使用運算子in來檢查指定的字串是否為另一個字串的子串。

>>> subject = '$$$ Get rich now!!! $$$'
>>> '$$$' in subject
True

CASE:輸入驗證
在這裡插入圖片描述

長度len、最小值min和最大值max

>>> numbers = [100, 34, 678]
>>> len(numbers)
3
>>> max(numbers)
678
>>> min(numbers)
34
>>> min([100, 34, 678])
34

以下呼叫max和min時指定的實參並不是序列,而直接將數作為實參。

>>> max(2, 3)
3
>>> min(9, 3, 2, 5)
2

2.3 列表:Python 的主力

2.3.1 函式list

使用字串來建立列表(也可以將元組轉化成列表)

>>> list('Hello')
['H', 'e', 'l', 'l', 'o']
>>> ‘’.join(['H', 'e', 'l', 'l', 'o'])
'Hello'

2.3.2 基本的列表操作

1.修改列表 給元素賦值 =
>>> x = [1, 1, 1]
>>> x[1] = 2
>>> x
[1, 2, 1]
2.刪除元素 del 列表名【索引號】
>>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl']
>>> del names[2]
>>> names
['Alice', 'Beth', 'Dee-Dee', 'Earl']
3.給切片賦值(替換,插入、刪除)
>>> X=[1,2,3,4,5,6]
>>> X[:2]=[11,22]
>>> X
[11,22,3,4,5,6]

>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']

通過使用切片賦值,可將切片替換為長度與其不同的序列

>>> name = list('Perl')
>>> name[1:] = list('ython')
>>> name
['P', 'y', 't', 'h', 'o', 'n']

使用切片賦值還可在不替換原有元素的情況下插入新元素——用空切片器替換
這裡的空切片器是numbers[1:1],numbers[4:0]也是

>>> numbers = [1, 5]
>>> numbers[1:1] = [2, 3, 4]
>>> numbers
[1, 2, 3, 4, 5]

取相反的措施來刪除切片——替換成空切片

>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:4] = []
>>> numbers
[1, 5]

2.3.3 列表方法

方法是與物件(列表、數、字串等)聯絡緊密的函式。像下面這樣呼叫方法:
object.method(arguments)

1.append(X) 用於將一個物件附加到列表末尾。
>>> lst = [1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]

Notice:每次只能追加一個元素或者序列,如果新增的是序列,原序列也是多一個子序列,注意與extend()的區別

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.append(b)
>>> a
[1, 2, 3, [4, 5, 6]]
2.clear() 就地清空列表的內容
>>> lst = [1, 2, 3]
>>> lst.clear()
>>> lst
[ ]

這類似於切片賦值語句lst[:] = []

3.copy() 複製列表

如果是以賦值的方式"複製",新舊列表其實質是指向同一個列表,其中一個修改,另一個也變,並未建立副本

>>> a = [1, 2, 3]
>>> b = a              #  b=a[:]   b=list(a)  才是複製,見下文
>>> b[1] = 4
>>> a
[1, 4, 3]

用copy函式才能建立一個副本,指向兩個不同的列表

>>> a = [1, 2, 3]
>>> b = a.copy()
>>> b[1] = 4
>>> a
[1, 2, 3]

這類似於使用a[:]或list(a),它們也都複製a

>>> a = [1, 2, 3]
>>> c = list(a)
>>> c[1] = 4
>>> a
[1, 2, 3]

>>> a = [1, 2, 3]
>>> d = a[:]
>>> d[1] = 4
>>> a
[1, 2, 3]
4.count(X) 計算指定的元素在列表中出現了多少次。
>>> ['to', 'be', 'or', 'not', 'to', 'be'].count('to')
2

>>> x = [[1, 2], 1, 1, [2, 1, [1, 2]]]
>>> x.count(1)
2
>>> x.count([1, 2])
1
5.extend(X) 同時將多個值附加到列表末尾
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]

Notice:注意與append()的區別
與拼接不同,拼接會返回一個新序列,並不是在原序列的基礎上修改

>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b    //extend效果:a=a+b  或者列表賦值給空切片 a[len(a):]=b
[1, 2, 3, 4, 5, 6] ///////////////////////////////////////////////////////////
>>> a
[1, 2, 3]       //[1, 2, 3, 1, 2, 3]

extend()等效方法:a=a+b 或者 列表賦值給空切片 a[len(a):]=b

6.index(X.n) 在列表中查詢指定值X第n次出現的索引
>>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni']
>>> knights.index('who')
4

查詢第2次的位置

>>> happy= [