Python入門筆記2 - 列表和元組

  • 很久以前就像學python了,還寫過一篇文章Python入門筆記1-基本數據類型,但是後來各種事情耽擱就沒怎麼看了,現在開始繼續學習
  • 參考書《Python基礎教程(第三版)》—— Magnus Lie Hetland

一、序列

  • Python中最基本的數據結構爲序列(這是一個統稱,包含列表/元組/字符串等多種結構),序列中每個元素都有索引編號,從0開始。Python也支持從隊尾找起的負索引。

1. 序列概述

  • 列表、元組、字符串都屬於序列
  • 列表是可以修改的,但元組不行。
  • 列表/元組中可以放不同類型的變量,也可以包含其他列表/元組
>>> data1 = ['NO.1',1]		#列表
>>> data2 = ['NO.2',2]		#列表
>>> dataSet = [data1,data2]	#列表
>>> dataSet
[['NO.1', 1], ['NO.2', 2]]

2. 序列的通用操作

  • 所有序列都支持以下操作:索引、切片、相加、相乘、成員資格檢查、迭代。還有一些內置函數可以用來找出序列中的最大最小值、序列長度等

(1)索引

  1. 序列中所有元素都有編號,左起第一個爲0,右起第一個爲-1
>>> data1=['NO.1',1]
>>> data1[0]
'NO.1'
>>> data1[-1]
1
>>> data1[1]
1
>>> data1[-2]
'NO.1'
  1. 對於序列字面量,可以直接進行索引,不用把它賦給變量
>>> ['Hello',1,'World',2][-2]
'World'
>>> "World"[-1]
'd'
  1. 如果函數返回一個序列,可以在調用的時候直接索引
>>> X = input("year:")[3]	# input讀取鍵盤輸入並返回一個字符串
year:2019					# 輸入2019
>>> X
'9'

(2)切片

  1. 切片用於訪問特定範圍內的元素,需要兩個索引
  2. 形式序列[begin,end,(step)]:序列,begin和end是兩個索引,返回一個新序列,值爲原序列下標[begin,end)區間。步長參數step可以不寫,缺省步長爲1
>>> num = "0123456789"
>>> num[2:5]
'234'
>>> num[-3:-1]
'78'
  1. 要切片結束於末尾,省略第二個索引;要切片起始於開頭,省略第一個索引
>>> num = "0123456789"
>>> num[2:]
'23456789'
>>> num[:3]
'012'
>>> num[:]
'0123456789'
  1. 步長:切片時添加元素的間隔,默認爲1,但也可以顯式指定
    1. 可以有負數步長,這時從右往左取數
    2. 注意步長不能是0,否則報錯
>>> num = "0123456789"
>>> num[::2]
'02468'
>>> num[2:7:3]
'25'
>>> num[8:3:-1]	#可以有負數步長
'87654'
>>> num[1:5:-2]
''

(3)相加

  1. 可以用加法拼接同型的序列,但是一般不能拼接不同型序列
  2. 返回一個新列表,不是原地修改
>>> data1 = ['NO.1',1]
>>> data2 = ['NO.2',2]
>>> data1 + data2		#拼接兩個列表
['NO.1', 1, 'NO.2', 2]

(4)乘法

  1. 序列與數字x相乘,表示重複這個序列x次
  2. 返回一個新列表,不是原地修改
>>> data1 = ['NO.1',1]
>>> data1*3
['NO.1', 1, 'NO.1', 1, 'NO.1', 1]
>>> [32]*10
[32, 32, 32, 32, 32, 32, 32, 32, 32, 32]
  1. 可以用乘法來初始化列表。Python中用none表示“什麼都沒有”,因此可按如下方法把列表長度初始化爲10
>>> sequence = [None]*5	#sequence長度爲5
>>> sequence
[None, None, None, None, None]

(5)成員資格

  1. 要檢查特定的值是否在序列中,可以使用運算符in,返回bool值True/False
>>> num = '0123456789'
>>> '1'in num
True
>>> 'a'in num
False
>>> input('Enter a number: ')in num
Enter a number: 3
True

二、列表(list)

  • 列表是序列的一種,這裏主要討論列表不同於元組和字符串的地方
    1. 列表是可變的,可以修改其內容
    2. 列表有很多特有方法

1. 創建列表

  1. 將元素用‘,’分割,加個方括號
>>> lst = [1,2,'A','string']
>>> lst
[1,2,'A','string']

2. 序列轉換爲列表list(x)

  1. List(x):List函數可以把任何序列x轉換爲列表。(list實際是一個類,這個其實是列表的構造函數之一)
>>> list("1234567890")
['1', '2', '3', '4', '5', '6', '7', '8', '9', '0']
>>> list([1,"10"])
[1, '10']
  1. 可以用''.join(list)字符列表list還原爲字符串
    • list中的元素必須都是char
    • 這個join方法其實是把list中每個char放到str前面重複,這裏放了一個空串,所以看起來是把list中字符拼成字符串了
>>> ''.join(['1', '2', '3', '4', '5', '6', '7', '8', '9', '0'])
'1234567890'

>>> string = 'ABC'.join(['1','2','3','4','5'])
>>> string
'1ABC2ABC3ABC4ABC5'

3. 列表基本操作

(1)給元素賦值

  1. 使用[]索引找到列表中一個元素並重新賦值(注意不要越界)

(2)刪除元素

  1. 刪除元素:使用del list[n]來刪除列表list中第n個元素(字典類型也支持這個)
>>> list = [1,2,3]
>>> list[1] = 103	#賦值
>>> list
[1, 103, 3]

>>> del list[1]		#刪除
>>> list
[1, 3]

(3)切片賦值

  1. 通過給切片賦值,可以將切片替換爲長度不同的序列
  2. 可以在不刪除原有元素的情況下插入新元素
  3. 可以用來刪除元素
>>> name = list("12345")	#切片賦值
>>> name[2:4]="abcd"
>>> name
['1', '2', 'a', 'b', 'c', 'd', '5']

>>> name = [1,5]			#插入元素(本質是切片賦值)
>>> name[1:1] = [2,3,4]
>>> name
[1, 2, 3, 4, 5]

>>> name = [1,5]			#刪除元素(本質是切片賦值)
>>> name[0:1] = []
>>> name
[5]

4. 列表方法

  • 列表list本身是一個類,這個類提供了若干方法。調用方法類似C/C++語言

(1)append(x): None方法

  1. 添加一個對象到列表末尾
  2. append方法就地修改列表,不會返回新列表
>>> num = list("12345")
>>> num
['1', '2', '3', '4', '5']
>>> num.append(6)
>>> num.append(“ABC”)
>>> num
['1', '2', '3', '4', '5', 6,'ABC']

#下面這個程序不好,因爲list是一個內置函數,如果用list起名,會導致list函數不能使用
>>> list = ["a",1]
>>> list.append("Hello")
>>> list
['a', 1, 'Hello']

(2)clear(): None方法

  1. 方法clear就地清空列表,類似切片語句lst[:]=[]
>>> lst = list("Hello")
>>> lst
['H', 'e', 'l', 'l', 'o']
>>> lst.clear()
>>> lst
[]

(3)copy(): list方法

  1. 常規賦值(如下)只是將另一個名字關聯到列表(類似C中typedef別名)
>>> lst_A = []
>>> lst_B = lst_A
>>> lst_B
[]
>>> lst_B.append("abc")
>>> lst_A
['abc']
  1. 方法copy複製列表,返回一個新列表,它是原列表的副本,這樣就能把新列表變量關聯到新列表,從而讓列表副本和原本獨立
>>> lst = []
>>> lst_ = lst.copy()
>>> lst_.append("123")
>>> lst_
['123']
>>> lst
[]

(4)count(x): integer方法

  1. 方法count統計指定元素再列表中出現了幾次
>>> [1,2,3,3,3,4,5,6].count(3)
3

(5)extend(x): None方法

  1. 方法extend同時添加多個值到列表末尾也就是說在列表末尾添加另一個列表
  2. extend類似列表拼接”+”,區別在於extend是在原表上修改,”+”返回了新列表
  3. a = a + ba.extend(b)效率低
  4. 還可以用切片實現extend效果,但是可讀性差
#extend方法
>>> lst = [1,2,3,4]
>>> lst.extend(list("abcde"))
>>> lst
[1, 2, 3, 4, 'a', 'b', 'c', 'd', 'e']

#用切片實現
>>> lst = [1,2,3,4]
>>> lst[len(lst):] = list("abcde")
>>> lst
[1, 2, 3, 4, 'a', 'b', 'c', 'd', 'e']

#用+運算實現
>>> lst = [1,2,3,4]
>>> lst += list("abcde")
>>> lst
[1, 2, 3, 4, 'a', 'b', 'c', 'd', 'e']

(6)index(x): integer方法

  1. index查找列表中指定值第一次出現的索引,如果不存在指定值會報錯
>>> [1,2,3,4].index(1)
0

(7)insert(n,object): None方法

  1. list.insert(n,object)用於將一個對象插入列表,位置爲n
  2. 用切片也可以實現類似效果,但可讀性不好
#insert
>>> a = [1,2,3]
>>> a.insert(2,"a")
>>> a
[1, 2, 'a', 3]

#切片實現
>>> a = [1,2,3]
>>> a[2:2]="a"
>>> a
[1, 2, 'a', 3]

(8)pop(): object方法

  1. pop從列表末尾刪除一個元素,並把它返回
  2. pop是唯一一個即修改原列表,又返回非none值的方法
>>> a = [1,2,3]
>>> b = a.pop()
>>> a
[1, 2]
>>> b
3

(9)remove(obj): None方法

  1. list.remove(obj)刪除列表中第一個爲obj的元素,如果表中不存在此元素會報錯
  2. 就地修改列表且無返回
>>> a = [1,2,3,4,5]
>>> a.remove(3)
>>> a
[1, 2, 4, 5]

(10)reverse(): None方法

  • 就地修改列表且不返回值,將列表就地反向排列
>>> a = [1,2,3,4,5]
>>> a.reverse()
>>> a
[5, 4, 3, 2, 1]

(11)sort(): None方法

  1. 對列表就地排序(默認從小到大),不返回值。從python2.7開始這個是穩定的排序算法
>>> a = [1,3,2,5,4]
>>> a.sort()
>>> a
[1, 2, 3, 4, 5]

#不要這樣做,這樣只會對a排序,b爲none
>>> a = [1,3,2,5,4]
>>> b = a.sort()

#先把b關聯(=)到a的副本,再sort
>>> a = [1,3,2,5,4]
>>> b = a.copy()
>>> b.sort()
>>> b
[1, 2, 3, 4, 5]
  1. 還可以使用內置函數sorted(object):list達到類似的效果。 Sorted函數可以用於任何序列(實際上,適用於任何可迭代對象),總是返回一個列表
>>> a = [1,3,2,5,4]
>>> b = sorted(a)
>>> b
[1, 2, 3, 4, 5]

#sorted函數可用於任何可迭代對象
>>>sorted(“Python”)
>>>[‘P’, ’h’ , ’n’ , ’o’ , ’t’ , ’y’]

(12)高級排序

  1. sort方法和sorted函數都可以接受兩個可選參數:key和reverse,它們是按名稱指定的,稱爲關鍵字參數
    1. Key指定排序的標準,類似C++中sort函數的cmp參數,區別在於,cmp函數直接判斷元素相對大小,Key參數則是用來對每個元素創建一個鍵,再根據這些鍵排序。Key可以設置爲自定義函數(後面再講)

    2. Reverse指定從小到大還是從大到小,只需將其指定爲True或False,代表要不要按相反的順序進行排序

#Key參數
>>> X = [123,12,1]
>>> X.sort(Key = len)  #假設Key的函數已經寫好了
>>> X
[1,12,123]

#reverse參數
>>> X = [1,2,3,4]
>>> X.sort(reverse = True)
>>> X
[4,3,2,1] 

(13)小結

  1. 無返回值的方法:
    append / clear / extend / insert / remove / reverse / sort
  2. 有返回值的方法:
    copy:返回副本列表
    count:返回指定元素出現次數
    index:返回指定元素首次出現的索引
    pop:返回表中最後一個元素
  3. 對列表進行就地修改的方法:
    append / clear / extend / pop / remove / reverse / sort

三、元組(tuple)

  • 元組和列表一樣都是序列,區別在於元組不可以修改

1、創建一個元組

  1. 將元素用‘,’分割即可,也可以加個圓括號
>>> 1,2,3
(1, 2, 3)
>>> (1,2,3)
(1, 2, 3)
  1. 空元組:用空括號表示
>>> ()
  1. 只有一個元素的元組:在值後加一個逗號
#注意不能(1)這樣,要加括號只能寫成(1,)
>>> 1,	
(1,) 

>>>(42)			#一個值直接加括號是沒用的
>>>42
>>> 3*(40+2)	#這樣不能創建元組
126
>>> 3*(40+2,)	#創建了元組,逗號至關重要
(42, 42, 42)

2、序列轉換爲元組

  1. 類似list類,tuple類可以把序列轉爲元組
#字符串 -> 元組
>>> a = tuple("Hello")
>>> a
('H', 'e', 'l', 'l', 'o')

#列表 -> 元組
>>> a = list("1234")
>>> a
['1', '2', '3', '4']
>>> b = tuple(a)
>>> b
('1', '2', '3', '4')

3、元組相關操作

  1. 元組的創建和訪問方法和列表完全類似
  2. 因爲元組不可修改,其他沒有什麼可以對元組進行的操作了

4、元組的作用

  1. 用作映射中的鍵(以及集合的成員)
  2. 有些內置函數返回元組
  3. 一般而言只用列表就可以滿足要求了,幾乎所有情況下都可以用列表代替元組(除非元組用作字典鍵,這是不可以修改的)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章