python基礎教程_學習筆記3:列表

列表

list函數

字符串不能像列表一樣被修改,所以有時候根據字符串創建列表會很有用。

list函數可以實現:

>>> list('signjing')

['s', 'i', 'g', 'n', 'j', 'i', 'n', 'g']

>>> list(['a','b'])

['a', 'b']

>>> list((1,2,'san'))

[1, 2, 'san']

 

可見:list函數適用於所有類型的序列,而不只是字符串。

 

同理,也可以將字符串組成的列表轉換爲字符串:

>>> ''.join(['a','b'])

'ab'

>>> ''.join(['abc','def'])

'abcdef'

注意:必須是字符串組成的列表纔可以。

基本的列表操作

改變列表:元素賦值

使用索引標記爲某個特定的,位置明確的列表元素賦值:

>>> list1=[1,3,4]

>>> list1[0]=2

>>> list1

[2, 3, 4]

 

>>> list1=[]

>>> list1[0]=2

 

Traceback (most recent call last):

  File "<pyshell#67>", line 1, in <module>

    list1[0]=2

IndexError: list assignment index out of range

可見:不能爲不存在的列表元素賦值;

正如之前學過的:如果希望創建不存在具備一定長度空列表,請使用None

刪除元素

使用del語句刪除列表元素;

>>> list1=['a','b',3]

>>> del list1[0]

>>> list1

['b', 3]

分片賦值

分片是個強大的特性,分片賦值更加強大;

>>> list1=list('qwer')

>>> list1[2:4]='ew'

>>> list1

['q', 'w', 'e', 'w']

可以使用與原序列長度不同的列表對分片進行替換:

>>> name=list('signjing')

>>> name[4:]='so'

>>> name

['s', 'i', 'g', 'n', 's', 'o']

>>> name[4:]='englist'

>>> name

['s', 'i', 'g', 'n', 'e', 'n', 'g', 'l', 'i', 's', 't']

使用空的分片進行替換可以對原序列進行插入操作:

>>> list1=list('qwer')

>>> list1[2:2]='ab'

>>> list1

['q', 'w', 'a', 'b', 'e', 'r']

同理,也可以使用空的序列對分片進行刪除操作:

>>> list1=list('qwer')

>>> list1[1:3]=''

>>> list1

['q', 'r']

 

在學習序列的分片操作時學習到步長的概念,同樣可以分片賦值:

>>> name=list('signjing')

>>> name[1:7:2]='ABC'

>>> name

['s', 'A', 'g', 'B', 'j', 'C', 'n', 'g']

 

>>> name=list('signjing')

>>> name[-2:-7:-2]='-_='

>>> name

['s', 'i', '=', 'n', '_', 'i', '-', 'g']

列表方法

一般來說,方法的調用方法:

對象.方法(參數)

append

append方法在列表末尾追加新的對象

注意:append方法和其它一些方法類似,只是在恰當位置修改原來的列表。

這意味着,它不是簡單地返回一個修改過的新列表,而是直接修改原來的列表。

 

>>> list1=list("copyright")

 

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't']

>>> list1.append('a')

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a']

 

>>> list1.append([2])

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a', [2]]

 

>>> list1.append((1,'3'))

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a', [2], (1, '3')]

count

count方法統計某個元素在列表中出現的次數:

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a', [2], (1, '3')]

>>> ['to','be','or','not','to','be'].count('to')

2

>>> x=[[1,2],1,[1,2,3],[1,2],1,3]

>>> x.count([1,2])

2

>>> x.count(1)

2

extend

extend方法可以在列表的末尾一次性追加另一個序列的多個值

換句話說,可以用新列表擴展原有的列表:

 

>>> list1=list("copyright")

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't']

>>> list1.extend('a')

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a']

>>> list1.extend([2])

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a', 2]

>>> list1.extend((1,'3'))

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a', 2, 1, '3']

 

 

看起來很像連接操作,extend方法修改了被擴展的序列,而連接操作則不會,只是返回了一個全新的列表。

>>> a=list('copyright')

>>> b=list('a')

>>> c=a+b

>>> c

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't', 'a']

>>> a

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', 't']

>>> b

['a']

 

也可以通過分片賦值來達到extend方法的效果,但從可讀性看來,顯然不如extend

>>> list1=list('copyright')

>>> list1[len(list1)-1]=[1,'3']

>>> list1

['c', 'o', 'p', 'y', 'r', 'i', 'g', 'h', [1, '3']]

index

index方法從列表中找出某值第一個匹配項的索引位置;

>>> list1=list('tomorrow')

>>> list1.index('r')

4

>>> list1.index('o')

1

 

如果找不到會引發錯誤:

>>> list1.index('z')

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: list.index(x): x not in list

 

可以優化:

>>> if 'z' in list1:

...     print list1.index('z')

... else:

...     print "NOT FOUND"

...

NOT FOUND

insert

insert方法將對象插入到列表中;

>>> list1=list('tomorrow')

>>> list1.insert(1,'ab')

>>> list1

['t', 'ab', 'o', 'm', 'o', 'r', 'r', 'o', 'w']

>>> list1.insert(2,('a','b'))

>>> list1

['t', 'ab', ('a', 'b'), 'o', 'm', 'o', 'r', 'r', 'o', 'w']

>>> list1.insert(2,['a','b'])

>>> list1

['t', 'ab', ['a', 'b'], ('a', 'b'), 'o', 'm', 'o', 'r', 'r', 'o', 'w']

 

extend方法,insert方法也可以通過分片賦值完成:

>>> list1=list('tomorrow')

>>> list1

['t', 'o', 'm', 'o', 'r', 'r', 'o', 'w']

>>> list1[1:1]=['ab']

>>> list1

['t', 'ab', 'o', 'm', 'o', 'r', 'r', 'o', 'w']

>>> list1[2:2]=[('a','b')]

>>> list1

['t', 'ab', ('a', 'b'), 'o', 'm', 'o', 'r', 'r', 'o', 'w']

>>> list1[2:2]=[['a','b']]

>>> list1

['t', 'ab', ['a', 'b'], ('a', 'b'), 'o', 'm', 'o', 'r', 'r', 'o', 'w']

pop

pop方法默認移除列表中的一個元素(默認是最後一個元素),並返回移除的這個元素;

 

>>> list1=list('tomorrow')

>>> list1.pop()

'w'

>>> list1

['t', 'o', 'm', 'o', 'r', 'r', 'o']

 

None不能被返回:

>>> list1=[None]*5

>>> list1

[None, None, None, None, None]

>>> list1.pop()

>>> list1

[None, None, None, None]

 

也可以通過索引指定要移除並返回的元素:

>>> list1.pop(3)

'o'

>>> list1

['t', 'o', 'm', 'r', 'r', 'o']

 

使用pop方法可以實現一種常見的數據結構——棧。

pop方法是出棧方法,python沒有入棧方法,但可以通過append方法代替;

>>> list1=list("zhan")

>>> list1

['z', 'h', 'a', 'n']

>>> list1.append(list1.pop())

>>> list1

['z', 'h', 'a', 'n']

當入棧的元素等於剛剛出棧的元素時,得到的結果還是原來的棧;

remove

remove方法移除某值的第一個匹配項;

>>> list1=list('tomoto')

>>> list1.remove('o')

>>> list1

['t', 'm', 'o', 't', 'o']

index方法一樣,當無匹配項時,返回錯誤:

>>> list1.remove('b')

Traceback (most recent call last):

  File "<stdin>", line 1, in <module>

ValueError: list.remove(x): x not in list

 

remove方法是一個沒有返回值的原位置改變方法,與pop正好相反;

reverse

reverse方法將列表元素反向存放;

>>> list1=list('abcde')

>>> list1.reverse()

>>> list1

['e', 'd', 'c', 'b', 'a']

該方法改變了列表,但也沒有返回值,這一點同removesort方法;

sort

sort方法用於在原位置對列表進行排序。在“原位置排序”意味着改變原來的列表,從而讓其中的元素能夠按一定的順序排列,而不是簡單地返回一個已排序的列表副本。

 

當用戶需要返回列表的已排序副本,同時又不希望改變列表時,是否可以這樣:

>>> list1=list('signjing')

>>> list2=list1.sort()

答案是否定的,通過這種方式得到的list2是空值;

 

但可以通過將列表副本賦予新的列表,然後再使用sort方法進行排序:

>>> list1=list('signjing')

>>> list2=list1[:]

>>> list2.sort()

>>> list2

['g', 'g', 'i', 'i', 'j', 'n', 'n', 's']

>>> list1

['s', 'i', 'g', 'n', 'j', 'i', 'n', 'g']

再次強調,list1[:]是包含了列表list1所有元素的分片,這是一種很有效率的複製列表的方法。

另一種獲取列表已排序列表副本的方法是使用sorted函數:

>>> list1=list('signjing')

>>> list2=sorted(list1)

>>> list2

['g', 'g', 'i', 'i', 'j', 'n', 'n', 's']

>>> list1

['s', 'i', 'g', 'n', 'j', 'i', 'n', 'g']

 

只是簡單地將列表賦值給新的列表,是不可以的。因爲,這樣做,讓list1list2指向了同一個列表

>>> list1=list('signjing')

>>> list2=list1

>>> list2.sort()

>>> list2

['g', 'g', 'i', 'i', 'j', 'n', 'n', 's']

>>> list1

['g', 'g', 'i', 'i', 'j', 'n', 'n', 's']

 

如果希望將一些元素按相反的順序排序,可以先使用sort方法(或sort函數),然後再使用reverse方法。或者也可以直接使用reverse參數。

列表方法小結

 

方法名稱 修改列表 返回值
append  修改
count  不修改
extend 修改
index  不修改
insert 修改
pop 修改
remove  修改
reverse  修改
sort  修改
發佈了69 篇原創文章 · 獲贊 73 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章