數(shù)據(jù)容器(數(shù)據(jù)結(jié)構(gòu))
前面我們介紹了 Python 最底層的基本數(shù)據(jù)類型:布爾型、整型输拇、浮點(diǎn)型以及字符串型。
本章將要提到的 數(shù)據(jù)結(jié)構(gòu)(容器) 题诵。在這一章中紧显,我們會把之前所學(xué)的基本 Python 類型以更為復(fù)雜的方式組織起來劲腿。這些數(shù)據(jù)結(jié)構(gòu)以后會經(jīng)常用到。在編程中鸟妙,最常見的工作就是將數(shù)據(jù)進(jìn)行拆分或合并焦人,將其加工為特定的形式
大多數(shù)編程語言都有特定的數(shù)據(jù)結(jié)構(gòu)來存儲由一系列元素組成的序列,這些元素以它們所處的位置為索引:從第一個到最后一個依次編號重父。前一章已經(jīng)見過 Python 字符串了花椭,它本質(zhì)上是字符組成的序列。
本節(jié)內(nèi)容
- 列表
- 元組
- 字典
- 集合
知識點(diǎn)回顧
- Python 中數(shù)據(jù)類型可以分為 數(shù)字型 和 非數(shù)字型
- 數(shù)字型
- 整型 (
int
) - 浮點(diǎn)型(
float
) - 布爾型(
bool
)- 真
True
非 0 數(shù)
—— 非零即真 - 假
False
0
- 真
- 整型 (
- 非數(shù)字型
- 字符串
- 在
Python
中房午,所有 非數(shù)字型變量 都支持以下特點(diǎn):- 都是一個 序列
sequence
矿辽,也可以理解為 容器 -
取值
[]
-
遍歷
for in
-
鏈接
+
和 重復(fù)*
- 切片
- 都是一個 序列
列表(list)
列表是最常見的一種數(shù)據(jù)形式,是一種 有序 的 序列 ,可以隨時添加和刪除其中的元素袋倔。
列表非常適合利用順序和位置定位某一元素雕蔽,尤其是當(dāng)元素的順序或內(nèi)容經(jīng)常發(fā)生改變時。與字符串不同宾娜,列表是可變的批狐。你可以直接對原始列表進(jìn)行修改:添加新元素、刪除或覆蓋已有元素前塔。
列表創(chuàng)建
-
List
(列表) 是Python
中使用 最頻繁 的數(shù)據(jù)類型嚣艇,在其他語言中通常叫做 數(shù)組 - 專門用于存儲 一串 信息
- 列表用
[]
定義,數(shù)據(jù) 之間使用,
分隔 - 列表的 索引 從
0
開始- 索引 就是數(shù)據(jù)在 列表 中的位置編號华弓,索引 又可以被稱為 下標(biāo)
注意:從列表中取值時食零,如果 超出索引范圍,程序會報(bào)錯
# 用 list 創(chuàng)建空列表
array = list()
array
# 用 [] 創(chuàng)建空列表
array2 = []
array2
創(chuàng)建一個列表
array3 = [1, 2, 3, 4, 5, 6, 7]
array3
# 列表中可以存放多種數(shù)據(jù)
array4 = [1, 2, 3, True, False, int, "str", array]
array
類型轉(zhuǎn)化
# 使用list()將其他數(shù)據(jù)類型轉(zhuǎn)換成列表
s = 'hello world !'
list(s)
['h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', ' ', '!']
列表取值
使用[offset]獲取與修改元素
# 直接獲取
s[0]
s[-1]
根據(jù)索引位置修改內(nèi)容
array3[0] = 5
列表切片
切片是返回一個新的內(nèi)容
Python中符合序列的有序序列都支持切片(slice)寂屏,例如列表贰谣,字符串,元組迁霎。
格式:[start:stop:step]
? [起始值:結(jié)束值:步長]
start: 起始索引吱抚,從0開始,-1表示結(jié)束
stop:結(jié)束索引
step:步長欧引,end-start频伤,步長為正時恳谎,從左向右取值芝此。步長為負(fù)時,反向取值
arr = list(range(10))
# 指定區(qū)間切片
arr[0:5]
# 從頭開始切片
arr[0:5]
# 切片到末尾
arr[0:]
# 省略參數(shù)切全部內(nèi)容
arr[:]
# 逆序切片
arr[-12:-7]
# 指定步長切片
arr[0:5:1]
arr[0:5:2]
列表常用操作
- 在
ipython
中定義一個 列表因痛,例如:l= list()
- 輸入
l.
按下TAB
鍵婚苹,ipython
會提示 列表 能夠使用的函數(shù)如下:
append() count() insert() reverse()
clear() extend() pop() sort()
copy() index() remove()
在變量后面輸入
.
,然后選擇針對這個變量要執(zhí)行的操作鸵膏,記憶起來比函數(shù)要簡單很多
分類 | 關(guān)鍵字 / 函數(shù) / 方法 | 說明 |
---|---|---|
增加 | append() | 添加元素至尾部 |
insert() | 在指定位置插入數(shù)據(jù) | |
刪除 | clear() | 清空列表 |
pop() | 默認(rèn)彈出末尾數(shù)據(jù) | |
pop(index) | 彈出指定索引數(shù)據(jù) | |
remove(data) | 移除指定數(shù)據(jù) | |
修改 | extend(列表2) | 將列表2 的數(shù)據(jù)追加到列表 |
查詢 | count(數(shù)據(jù)) | 統(tǒng)計(jì)數(shù)據(jù)出現(xiàn)的次數(shù) |
index(內(nèi)容) | 查詢內(nèi)容所在位置 | |
其他 | copy() | 將列表復(fù)制一份 |
sort() | 排序 | |
reverse() | 逆序列表 |
案例:
In [7]: arr = list(range(1, 5))
# 添加元素到末尾
In [8]: arr.append(5)
In [9]: arr
Out[9]: [1, 2, 3, 4, 5]
# 插入元素到第一個
In [10]: arr.insert(0, 0)
In [11]: arr
Out[11]: [0, 1, 2, 3, 4, 5]
# 默認(rèn)彈出最后一個元素
In [12]: arr.pop()
Out[12]: 5
# 指定彈出第一個元素
In [13]: arr.pop(0)
Out[13]: 0
In [14]: arr
Out[14]: [1, 2, 3, 4]
# 指定刪除內(nèi)容為 4 的元素
In [15]: arr.remove(4)
In [16]: arr
Out[16]: [1, 2, 3]
# 合并[4, 5, 6]列表
In [17]: arr.extend([4,5,6])
In [18]: arr
Out[18]: [1, 2, 3, 4, 5, 6]
# 查詢內(nèi)容為 4 的元素在第幾個位置
In [19]: arr.index(4)
Out[19]: 3
# 排序后將內(nèi)容輸出(默認(rèn)為升序)
In [20]: arr.sort(reverse=True)
In [21]: arr
Out[21]: [6, 5, 4, 3, 2, 1]
# 排序后將內(nèi)容輸出
In [22]: arr.sort()
In [23]: arr
Out[23]: [1, 2, 3, 4, 5, 6]
其他用方法
- 使用in判斷值是否存在
- 使用 += 合并列表
- 使用
len()
獲取長度 - 使用join()轉(zhuǎn)換為字符串
In [24]: 2 in arr
Out[24]: True
In [25]: arr + [7,8,9]
Out[25]: [1, 2, 3, 4, 5, 6, 7, 8, 9]
In [26]: arr
Out[26]: [1, 2, 3, 4, 5, 6]
In [27]: len(arr)
Out[27]: 6
案例:
l = ['a', 'b', 1, 2, 3, 'c', 'd']
"""
打印將列表前兩位與后兩位刪除的列表
打印將列表第三到第六位之間刪除內(nèi)容
"""
列表推導(dǎo)式(簡單介紹)
推導(dǎo)式comprehensions(又稱解析式)膊升,是Python的一種獨(dú)有特性。推導(dǎo)式是可以從一個數(shù)據(jù)序列構(gòu)建另一個新的數(shù)據(jù)序列的結(jié)構(gòu)體谭企。
x = []
for i in range(1,11):
x.append(i)
[x for x in range(1,11)]
對象引用廓译、淺拷貝、深拷貝(拓展债查、難點(diǎn)非区、重點(diǎn))
使用=賦值(對象引用)
>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> b = a
>>> b
[1, 2, 3]
>>> a[0] = 'surprise'
>>> a
['surprise', 2, 3]
>>> b
['surprise', 2, 3]
>>> b[0] = 'I hate surprises'
>>> b
['I hate surprises', 2, 3]
>>> a
['I hate surprises', 2, 3]
淺拷貝(copy)
>>> a = [1, 2, 3]
>>> b = a.copy()
>>> c = list(a)
>>> d = a[:]
>>> a[0] = 'integer lists are boring'
>>> a
['integer lists are boring', 2, 3]
>>> b
[1, 2, 3]
>>> c
[1, 2, 3]
>>> d
[1, 2, 3]
深拷貝(deepcopy)
>>> import copy
>>> a = [1, 2, 3, [1, 2, 3]]
>>> b = copy.copy(a)
>>> a[3][0] = "surprises"
>>> b
[1, 2, 3, ['surprises', 2, 3]]
>>> c = copy.deepcopy(b)
>>> b[3][0] = "i hate surprises"
>>> c
[1, 2, 3, ['surprises', 2, 3]]
>>> b
[1, 2, 3, ['i hate surprises', 2, 3]]
總結(jié):
copy.copy 淺拷貝 只拷貝父對象,不會拷貝對象的內(nèi)部的子對象盹廷。
copy.deepcopy 深拷貝 拷貝對象及其子對象