列表
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']
該方法改變了列表,但也沒有返回值,這一點同remove和sort方法;
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']
只是簡單地將列表賦值給新的列表,是不可以的。因爲,這樣做,讓list1和list2指向了同一個列表:
>>> 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 | 修改 | 無 |