每日一python(8):基礎資料結構----列表
List(列表)是Python內建的一種資料型別。List是一種有序的集合,可以隨時新增和刪除其中的元素。
比如,列出班裡所有同學的名字,就可以用一個list表示:
>>> classmates = ['Bob', 'tracy', 'Jack', 'Judy']
>>> classmates
['Bob', 'tracy', 'Jack', 'Judy']
說明: 變數classmates就是一個list。
列表的相關操作如下:
(1)獲取list的長度(即元素個數)
>>> len(classmates) 4
(2)用索引訪問某個元素
>>> classmates[2] 'Jack' >>> classmates[3] 'Judy' >>> classmates[1] 'tracy' >>> classmates[0] 'Bob' >>> classmates[4] Traceback (most recent call last): File "<pyshell#15>", line 1, in <module> classmates[4] IndexError: list index out of range
說明: list的索引是從0開始算起,當索引超出了範圍時,Python會報一個IndexError錯誤,所以,要確保索引不要越界,記得最後一個元素的索引是len(classmates) - 1 。
另外,如果我們要獲取list的最後一個元素,也可以如下:
>>> classmates[-1]
'Judy'
同樣,如果要獲取倒數第2個,倒數第3個元素,倒數第4個元素,則:
>>> classmates[-2] 'Jack' >>> classmates[-3] 'tracy' >>> classmates[-4] 'Bob'
同樣的要獲取classmates中倒數第5個元素,也會報index越界的錯誤,如下:
>>> classmates[-5]
Traceback (most recent call last):
File "<pyshell#20>", line 1, in <module>
classmates[-5]
IndexError: list index out of range
(3)往列表中追加元素
>>> classmates.append('Adam')
>>> classmates
['Bob', 'tracy', 'Jack', 'Judy', 'Adam']
(4)在指定位置插入元素
>>> classmates.insert(0, 'Linda')
>>> classmates
['Linda', 'Bob', 'tracy', 'Jack', 'Judy', 'Adam']
>>> classmates.insert(3, '張三')
>>> classmates
['Linda', 'Bob', 'tracy', '張三', 'Jack', 'Judy', 'Adam']
(5)刪除列表末尾的元素
>>> classmates.pop()
'Adam'
>>> classmates
['Linda', 'Bob', 'tracy', '張三', 'Jack', 'Judy']
(6)刪除指定位置的元素
>>> classmates.pop(3)
'張三'
>>> classmates
['Linda', 'Bob', 'tracy', 'Jack', 'Judy']
(7)替換元素
>>> classmates[2] = 'Sarah'
>>> classmates
['Linda', 'Bob', 'Sarah', 'Jack', 'Judy']
(8)List中元素可以是不同型別,比如:
>>> L = ['apple', 123, True]
>>> L
['apple', 123, True]
(9)List也可以是某個List中的元素,如:
>>> L = ['apple', 123, ['Jack', 23, 'Shanghai'], True]
>>> L
['apple', 123, ['Jack', 23, 'Shanghai'], True]
即:
>>> P = ['Jack', 23, 'Shanghai']
>>> L = ['apple', 123, P, True]
>>> L
['apple', 123, ['Jack', 23, 'Shanghai'], True]
要獲取到元素‘Jack’,則:
>>> L[2][0]
'Jack'
一些問題:
1. append() 方法和 extend() 方法都是向列表的末尾增加元素,請問他們有什麼區別?
append() 方法是將引數作為一個元素增加到列表的末尾。
extend() 方法則是將引數作為一個列表去擴充套件列表的末尾。
name = ['D','o','g']
name.append('C')
print(name)
name.extend(['-','H'])
print(name)
name.append(['*','G'])
print(name)
返回結果:
2.列印列表
有列表 member = [‘張三’, 88, ‘李四’, 90, ‘王五’, 85, ‘劉二’, 90, ‘王大’, 88],打印出來:
方法1:
member = ['張三', 88, '李四', 90, '王五', 85, '劉二', 90, '王大', 88]
for each in member:
print(each)
列印結果:
感覺上面的列印結果不太美觀,還可以這樣列印:
# 方法1:
count = 0
length = len(member)
while count < length:
print(member[count], member[count+1])
count += 2
# 方法2:
for each in range(len(member)):
if each % 2 == 0:
print(member[each], member[each+1])
列印結果:
3. 請問 list[0] 和 list[0:1] 一樣嗎?
不一樣,list[0] 返回第0個元素的值,list[0:1] 返回一個只含有第0個元素的列表。
例如:
member = ['張三', 88, '李四', 90, '王五', 85, '劉二', 90, '王大', 88]
print(member[0])
print(member[0:1])
列印結果:
4. 如果你每次想從列表的末尾取出一個元素,並將這個元素插入到列表的最前邊,你會怎麼做?
最簡單的方法: list.insert(0,list.pop())
如:
list = ['b','c','d','a']
list.insert(0,list.pop())
print(list)
列印結果:
5. 列表的拷貝問題
我們可以利用分片完成列表的拷貝: list2 = list1[:],那我們可不可以直接寫成 list2 = list1 更加簡潔呢??
我們通過一段簡單程式碼來看一下,到底結果如何:
list1 = [1, 3, 2, 9, 7, 8]
list2 = list1[:]
list3 = list1
print("list1: ", list1)
print("list2: ", list2)
print("list3: ", list3)
列印結果:
從上面的列印結果可以看到,list2和list3似乎都完成了對列表list1的複製,但真的是這樣的嗎?我們藉助一個函式來看一下究竟是怎麼回事!
list1 = [1, 3, 2, 9, 7, 8]
list2 = list1[:]
list3 = list1
print("list1: ", list1)
print("list2: ", list2)
print("list3: ", list3)
print("===== 對 list1 進行一下排序操作 ======")
list1.sort()
print("list1: ", list1)
print("list2: ", list2)
print("list3: ", list3)
列印結果:
從上面的列印結果可以看到,我們隊list1進行了排序操作後,list2還是原來的順序,而list3也一起跟著進行了排序操作。
這裡作一下說明:
在python中,物件的賦值就是簡單的物件引用,list3和list1是一樣的,它們指向同一片記憶體,list3不過是list1的別名,是引用。我們可以使用list1與list3是否相同來判斷,結果返回True,表明它們地址相同,內容相同。
賦值操作(包括物件作為引數、返回值)不會開闢新的記憶體空間,它只是複製了新物件的引用。 也就是說,除了list3這個名字以外,沒有其它的記憶體開銷。
修改了list1,就影響了list3;同理,修改了list3就影響了list1。
6. 列表排序問題
順序排序: list.sort()
逆序排序:
list.sort()
list.reverse()
或者: list.sort(reverse = True)
list = [1, 3, 2, 9, 7, 8]
list.sort()
print("list順序排序: ", list)
list.reverse()
print("list逆序排序: ", list)
list.sort(reverse=True)
print("list逆序排序: ", list)
列印結果:
7. 列表推導式
列表推導式是一種快速生成列表的方式。其形式是用方括號括起來的一段語句,如下例子所示:
list = [x * x for x in range(1, 10)]
print(list)
列印結果:
列表推導式這樣理解:首先執行for迴圈,對於每一個x,代入x*x中進行運算,將運算結果逐一新增到一個新列表內,迴圈結束,得到最終列表。它相當於下面的程式碼:
list = []
for i in range(1, 10):
list.append(i*i)
print(list)
列印結果:
列表推導式為我們提供了一種在一行內實現較為複雜邏輯的生成列表的方法。其核心語法是用中括號[]將生成邏輯封裝起來。
列表推導式的變式:
(1)增加條件語句
>>> [x * x for x in range(1, 11) if x % 2 == 0]
[4, 16, 36, 64, 100]
(2)多重迴圈
>>> [a + b for a in ‘123' for b in ‘abc']
['1a', '1b', '1c', '2a', '2b', '2c', '3a', '3b', '3c']