這篇文章主要介紹串列的一些知識,
函式list
首先需要說明的是,串列與元組、字串一樣都是一種序列,但不同的是串列是可變的,即可修改其內容,
因為不能像修改串列那樣修改字串,所以有些情況下使用字串來創建串列很有幫助,函式list可以用來創建串列,
>>> list('hello')
['h', 'e', 'l', 'l', 'o']
>>>
>>> ''.join(['h', 'e', 'l', 'l', 'o'])
'hello'
- 注意,可以將任何序列(而不僅僅是字串)作為list的引數,
- 字串列也可以轉換為字串,需要用到關鍵字join,
基本的串列操作
可對串列執行所有標準序列操作,如索引、切片、拼接、相乘,元素檢查等,
但是因為串列是可變的,所以串列還有一些特有的修改元素的操作,
- 修改串列:給元素賦值
修改串列可有使用賦值陳述句,但是需要結合索引使用:
>>>
>>> x = [1, 2, 3, 4, 5]
>>> x[1] = 'h'
>>> x
[1, 'h', 3, 4, 5]
>>>
注意,不能給不存在的元素賦值,即索引不能超出list范圍
- 洗掉元素
從串列中洗掉元素,使用del陳述句:
>>>
>>> names = ['Alice', 'Beth', 'Cecil', 'Dee-Dee', 'Earl']
>>> del names[2]
>>> names
['Alice', 'Beth', 'Dee-Dee', 'Earl']
>>>
- 給切片賦值
序列的切片是一項極其強大的功能,串列中還能夠給切片賦值
>>
>>> name = list('Perl')
>>> name
['P', 'e', 'r', 'l']
>>> name[2:] = list('ar')
>>> name
['P', 'e', 'a', 'r']
>>>
>>> name = list('Perl')
>>> name[1:] = list('python')
>>> name
['P', 'p', 'y', 't', 'h', 'o', 'n']
>>>
>>> numbers = [1, 5]
>>> numbers[1:1] = [2, 3, 4]
>>> numbers
[1, 2, 3, 4, 5]
>>> numbers[1:4] = [] # 等效于 del numbers[1:4]
>>> numbers
[1, 5]
>>>
可以同時給多個元素賦值,通過切片賦值;
還可以將切片替換為長度與其不同的序列;
使用切片賦值還可以在不替換原有元素的情況下插入新的元素
串列方法
方法是與物件(串列、數、字串等)聯系緊密的函式,呼叫方法語法為:object.method(arguments).
- append()
方法append用于將一個物件附加到串列的末尾,
>>>
>>> lst = [1, 2, 3]
>>> lst.append(4)
>>> lst
[1, 2, 3, 4]
>>>
append只能就地修改串列,并不會回傳修改后的新串列,而是直接修改舊串列,
關于命名:
- 不要與python關鍵字重復,否則會出現無法呼叫同名關鍵字函式的情況
- 做到“見名知意”,例如串列的名稱為prices、prices_of_eggs、pricesOfEgges
- clear()
方法clear就地清空串列的內容,
>>>
>>> lst = [1, 2, 3]
>>> lst.clear() # 等價于賦值陳述句 lst[:] = []
>>> lst
[]
>>>
- copy()
方法copy復制串列,
>>>
>>> a = [1, 2, 3]
>>> b = a
>>> b[1] = 4
>>> a
[1, 4, 3]
>>> c = a.copy()
>>> c[1] = 5
>>> a
[1, 4, 3]
>>> c
[1, 5, 3]
>>>
常規復制只是將另一個表名關聯到串列,例如 b = a , 修改 b 的元素值實際上就是修改 a 的元素值
通過 copy復制是通過將 c 關聯到 a 的副本創建一個新的串列,修改 c 的元素值不會影響 a 中元素值,此時類似于 a[:] 或 list(a)
- count()
方法count計算指定的元素在串列中出現了多少次,
>>>
>>> ['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
>>>
- extend()
方法extend能夠同時將多個值添加到串列末尾,為此可以將這些值組成的序列作為引數,即可使用一個串列來拓展另一個串列,
>>>
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a.extend(b)
>>> a
[1, 2, 3, 4, 5, 6]
>>> a.extend(7,8,9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: list.extend() takes exactly one argument (3 given)
>>>
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a + b
[1, 2, 3, 4, 5, 6]
>>> a
[1, 2, 3]
>>>
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a = a + b # 使用拼接達到extend的效果,但是效率比較低
>>> a
[1, 2, 3, 4, 5, 6]
>>>
>>> a = [1, 2, 3]
>>> b = [4, 5, 6]
>>> a[len(a):] = b # 切片實作相同的效果,可行,但是可讀性不高
>>> a
[1, 2, 3, 4, 5, 6]
>>>
extend方法的使用類似于拼接,但是重要差別是會修改被拓展的序列,而拼接回傳的是一個全新的序列,
拼接的原理是使用a和b的副本創建一個新串列,使用拼接達到相同的效果時,拼接的效率比較低,或者使用切片完成,
- index()
方法index在串列中查找指定值第一次出現的索引,
>>>
>>> knights = ['We', 'are', 'the', 'knights', 'who', 'say', 'ni']
>>> knights.index('who')
4
>>> knights.index('herring')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: 'herring' is not in list
>>> knights[4]
'who'
>>>
- insert()
方法insert用于將一個物件插入串列,
>>>
>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers.insert(3, 'four')
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]
>>>
>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers[3:3] = 'four' # 這里需要注意的是,插入一個字串型別的元素到串列中需要寫成只有該元素的串列,否則會出現多個元素
>>> numbers
[1, 2, 3, 'f', 'o', 'u', 'r', 5, 6, 7]
>>> numbers = [1, 2, 3, 5, 6, 7]
>>> numbers[3:3] = ['four'] # 于extend一樣,可以通過切片的方式實作相同的效果,但是可讀性依舊不強
>>> numbers
[1, 2, 3, 'four', 5, 6, 7]
>>>
- pop()
方法pop從串列中洗掉一個元素(默認為最后一個元素),并回傳該元素,
>>>
>>> x = [1, 2, 3]
>>> x.pop()
3
>>> x
[1, 2]
>>> y = x.pop(0)
>>> y
1
>>> x
[2]
>>>
>> x = [1, 2, 3]
>>> x.append(x.pop())
>>> x
[1, 2, 3]
>>>
>>> x = [1, 2, 3]
>>> x.insert(0, x.pop())
>>> x
[3, 1, 2]
>>>
>>> x = [1, 2, 3]
>>> x.append(x.pop(0))
>>> x
[2, 3, 1]
>>>
注意,pop是唯一既可以修改串列又回傳一個非None值的串列方法,
使用pop可實作一種常用的資料結構——堆疊(stack),堆疊就像一疊盤子,可以在上面添加盤子,還可以從上面取走盤子,最后加入的盤子最先取走,即后進先出(LIFO=last in first out),
還有一種與堆疊對應的資料結構稱為——堆(heap),堆的概念正好與堆疊相反,最先放入的盤子最先出去,即先進先出(FIFO=first in first out),佇列是一種堆,
push和pop是大家普遍接受的兩種堆疊操作(加入和取走)的名稱,Python中沒有提供push,可以使用append代替,方法pop和append的效果正好相反,
要創建先進先出(FIFO)的佇列,可以使用insert(0,...)代替append,另外也可以使用append,用pop(0)代替pop(),或使用collections模塊中的deque,
- remove()
方法remove用于洗掉第一個為指定元素的值,
>>>
>>> x = ['to', 'be', 'or', 'not', 'to', 'be']
>>> x.remove('be')
>>> x
['to', 'or', 'not', 'to', 'be']
>>> x.remove('bee')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: list.remove(x): x not in list
>>>
remove無法洗掉串列中不存在的元素,
remove是就地修改串列且不回傳值的方法之一,不同于pop,它修改串列但是不回傳任何值,
- reverse()
方法reverse按相反的順序排列串列中的元素,
>>>
>>> x = [1, 2, 3]
>>> x.reverse()
>>> x
[3, 2, 1]
>>>
>>> x = [1, 2, 3]
>>> y = reversed(x)
>>> y
<list_reverseiterator object at 0x015514D8>
>>> list(y)
[3, 2, 1]
>>>
注意reverse修改串列,但是不回傳任何值(與remove和sort等方法一樣),
如果要按相反的順序迭代序列,可以使用函式reversed,這個函式回傳的結果是一個迭代器,可以使用list轉換為串列,
- sort()
方法sort用于對串列就地排序,會對原來的串列進行修改,而不是回傳排序后的串列副本,
>>>
>>> x = [4, 5, 6, 1, 9 ,0 ,3]
>>> x.sort()
>>> x
[0, 1, 3, 4, 5, 6, 9]
>>>
>>> x = [4, 5, 6, 1, 9 ,0 ,3]
>>> y = x.sort() # 由于sort修改x且不回傳任何值,最終的結果是x經過排序的,所以y是None
>>> print(y)
None
>>>
>>> x = [4, 5, 6, 1, 9 ,0 ,3]
>>> y = x.copy()
>>> y.sort()
>>> x
[4, 5, 6, 1, 9, 0, 3]
>>> y
[0, 1, 3, 4, 5, 6, 9]
>>>
>>> x = [4, 5, 6, 1, 9 ,0 ,3]
>>> y = sorted(x) # 函式sorted()回傳排序后的串列
>>> x
[4, 5, 6, 1, 9, 0, 3]
>>> y
[0, 1, 3, 4, 5, 6, 9]
>>>
>>> sorted('Python')
['P', 'h', 'n', 'o', 't', 'y']
>>>
>>>
>>> x = [4, 5, 6, 1, 9 ,0 ,3]
>>> x.sort(reverse=True) # sort支持可選引數reverse:Ture or False
>>>
>>> x
[9, 6, 5, 4, 3, 1, 0]
>>>
>>> x = [4, 5, 6, 1, 9 ,0 ,3]
>>> x.sort(reverse=False) # sort支持可選引數reverse:Ture or False
>>> x
[0, 1, 3, 4, 5, 6, 9]
>>>
>>> x = ['aardvark', 'abalone', 'acme', 'add', 'aerate']
>>> x.sort(key=len) # sort支持可選引數key
>>> x
['add', 'acme', 'aerate', 'abalone', 'aardvark']
>>>
函式sorted()的回傳值是排序后的串列,注意sort()無回傳值,sorted可以用于任何序列,回傳的總是一個倒置的串列,
方法sort接受兩個可以選引數:key和reverse,稱為關鍵字引數,同樣sorted也支持可選引數key和reverse,此處可以將key設定為一個函式很管用,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/534108.html
標籤:Python
下一篇:python中的公共操作和推導式
