一舵抹、 什么是數(shù)據(jù)結(jié)構(gòu)
在計算機科學中,數(shù)據(jù)結(jié)構(gòu)(英語:data structure)是計算機中存儲轻要、組織數(shù)據(jù)的方式宇立。
1. Python 中核心數(shù)據(jù)結(jié)構(gòu)分類
- 序列類型: 字符串、列表步势、元組
- 泛映射類型: 字典
- 集合: set()
在 Python中列表氧猬、元組、字典坏瘩、集合都稱為容器盅抚。
2. 序列類型數(shù)據(jù)結(jié)構(gòu)共有的特點:
- 序列類型中的元素都有對應的位置,這個位置叫偏移量或者索引
二倔矾、列表
1. 列表的特性介紹
列表內(nèi)的元素是可變的妄均。
-> 列表的元素可以是 Python 的任何類型的數(shù)據(jù)和對象如:字符串、列表哪自、元組丰包、字典、集合壤巷、函數(shù)邑彪、類
列表中的具有相同值的元素允許出現(xiàn)多次
[1, 2, 1, 1, 1, 1, 3, 3, 2]
2. 創(chuàng)建列表
嵌套的列表
列表中可包含 python 中任何類型的元素(對象),當然也可以包括一個或多個列表
li = [['one', 'two', 'three'], [1, 2, 3]]
3.列表的基本操作
3.1 取值
沒有嵌套的列表
li_f = [ 'insert', 'append','extend', 'remove', 'pop', 'sort', 'sorted']
li_f[0] # insert
嵌套的列表
l2 = [['one', 'two', 'three'], [1, 2, 3]]
l2[0][1] # two
3.2 切片
同字符串的切片一樣,詳情參考字符串教程中的切片
幾點簡單示例
li_f = [ 'insert', 'append','extend', 'remove', 'pop', 'sort', 'sorted']
# 獲取全部元素
li_f[:]
# 反轉(zhuǎn)
li_f[::-1]
3.3 必會方法
# 先定義一個列表
li = [5, 4, 3, 2, 1, 0]
len()
方法是一個內(nèi)置函數(shù)隙笆,可以統(tǒng)計序列類型的數(shù)據(jù)結(jié)構(gòu)的長度锌蓄。
n = len(li)
print(n)
in
判斷元素是否存在于列表中。
if 5 in li:
print('我存在')
append()
向列表的最后位置撑柔,添加一個元素瘸爽,只接收一個參數(shù)。
li.append('a')
print(li)
insert()
向原列表的指定位置插入一個元素铅忿,接收兩個參數(shù)剪决,
第一個是索引號,第二個是要插入的元素檀训。
li.insert(0, 'b')
print(li)
extend()
可以把一個序列類型中的每個元素追加到原列表中柑潦,接收的參數(shù)是一個序列類型的數(shù)據(jù)(字符串,列表)峻凫。
l2 = ['qf','yangge']
li.extend(l2)
print(li)
remove()
移除列表中某個指定的元素渗鬼,沒有返回值,并且假如有多個相同值的元素存在荧琼,每次只會移除排在最前面的那個元素
obj.remove('a') 譬胎。
pop()
從原列表中刪除一個元素差牛,并且把這個元素返回。
接收零個或一個參數(shù)堰乔,參數(shù)是偏移量偏化,int 類型。
# 刪除列表中的最后一個元素
li.pop()
# 刪除列表中第二個索引號對應的元素镐侯,并且返回這個元素侦讨,用變量名`n` 接收。
n = li.pop(2)
''.join()
把列表中的元素拼接起來苟翻,返回的是字符串類型
l7 = ['a','b']
s = ''.join(l7)
print(s)
# 輸出
'ab'
還可以以指定的字符進行拼接
l7 = ['a','b']
s = '-'.join(l7)
print(s)
# 輸出
'a-b'
index
返回指定元素的索引號韵卤。
idx = li.index(4)
print(idx)
*count()
是列表的內(nèi)置方法,可以統(tǒng)計出相同值的元素在列表中總共
出現(xiàn)都少次.
num = obj.count(4)
print(num)
sort()
是列表的內(nèi)置方法袜瞬,對列表中元素進行排序怜俐。
默認是升序, 這個改變列表自身邓尤。
還可以接收一個 reverse (反轉(zhuǎn)) 參數(shù), 其值可以是 True 和 False拍鲤。
False 是升序,True 是降序汞扎。需要是同一種數(shù)據(jù)類型季稳,比如都是字符串,或都是整型澈魄。
示例:
l5 = [2, 4, 23, 34, 100]
l5.sort(reverse=True)
print(l5)
# 輸出:
[100, 34, 23, 4, 2]
sorted()
是 python 的內(nèi)置函數(shù)景鼠,接受一個參數(shù),參數(shù)可以是任意序列類型的數(shù)據(jù)痹扇,但是元素的類型必須相同.
比如是含有都是 str 的列表铛漓,或者是含有都是 int 的列表
它會返回一個新的類別,原列表不變鲫构。
li = [2,10,3,7]
l10 = sorted(li)
print(li)
print(l10)
4. 通過索引和切片修改列表
索引號
In [11]: int_number = [1,2,3,4,5]
In [12]: int_number[2]=20
In [13]: int_number
Out[13]: [1, 2, 20, 4, 5]
切片
li = [1, 2, 3, 4, 5]
li[1:3] = [0]
print(li)
5. 引用賦值
In [192]: a
Out[192]: ['6', '5', '3', '1', '1']
In [193]: b = a
In [194]: b
Out[194]: ['6', '5', '3', '1', '1']
In [195]: a[-2]=2
可以看到浓恶,這種用等號將一個列表賦值給多個變量時,使用其中任意一個變量對列表的操作结笨,結(jié)果都會同步到其他變量的值包晰。
在這種現(xiàn)象中,就像前面學到的變量的賦值炕吸,變量和列表本身之間的關(guān)系稱作伐憾,變量對列表對象的引用,并沒有創(chuàng)建一個新的列表赫模。
解決方法
- 使用以下任意一種方法,都可以將原列表的值賦值給一個新的列表
- 列表的內(nèi)置函數(shù) obj.copy()
- 序列類型函數(shù) list(obj)
- 列表切片
以上方法得到的列表可賦值給一個新的變量屁使, 這變量各自有自己的列表對象淘钟,互相之間不會影響
6. 深淺拷貝
In [110]: base_count = ['name',['money',100.00]]
In [111]: xmen = list(base_count)
In [112]: xpan = base_count.copy()
In [113]: xmen[1][1] = 20.00
In [114]: xpan
Out[114]: ['name', ['money', 20.0]]
點我可視化你的代碼
解決辦法
# 導入模塊
import copy
base_count = ['name',['money',100.00]]
# 利用模塊中的 copy 方法創(chuàng)建一個全新的對象
xmen_new = copy.deepcopy(base_count)
# 利用模塊中的 copy 方法創(chuàng)建另一個全新的對象
xpan_new = copy.deepcopy(base_count)
# 改變其中一個對象中的值
xpan_new[1][1] = 50.00
# 分別打印兩個對象
print(xmen_new)
print(xpan_new)
三柿汛、元組
1 元組特性介紹
- 元組和列表一樣,也是一種序列莉钙。
- 唯一的不同是,元組是相對不可變的筛谚。
2 高效創(chuàng)建元組
t1 = () # 創(chuàng)建 空 元素的元組
-
你以為這就完了?
單一元素元組怎么搞停忿?
In [168]: v_tp = (3)
In [169]: only_tp = 3,
In [170]: type(v_tp)
Out[170]: int
In [171]: type(only_tp)
Out[171]: tuple
創(chuàng)建非空元素的元組是用
逗號
驾讲,而不是用小括號
tuple()
可以對其他序列類型的數(shù)據(jù)轉(zhuǎn)換為元組。
In [173]: s1 = 'car'
In [174]: li = [1,2,3]
In [175]: tuple(s1)
Out[175]: ('c', 'a', 'r')
In [176]: tuple(li)
Out[176]: (1, 2, 3)
In [177]: dl = [1,2,3,['a','b']]
In [178]: tuple(dl)
Out[178]: (1, 2, 3, ['a', 'b'])
In [33]: t1 = (1, 2, 3, ['a', 'b'])
In [34]: t1[3][0]=0
In [35]: t1
Out[35]: (1, 2, 3, [0, 'b'])
3 使用元組的理由
給我一個理由
- 占用內(nèi)存空間小
- 元組內(nèi)的值不會被意外的修改
- 可作為字典的鍵
- 函數(shù)的參數(shù)是以元組形式傳遞的
- 命名元組有時候可以代替類的對象(面向?qū)ο蟮臅r候講)