Python3——內置數據結構:list 、tuple

內置數據結構(變量類型)

list(列表)

  • 一組有順序的數字的組合
  • 創建列表
    • 空列表
l1=[]   #創建一個空列表  
print(type(l1))
print(l1)
l2=[100]  #創建一個帶值得列表
print(type(l2))
print(l2)
l3=[2,5,5,8,1,3]   #創建帶多個值得列表
print(type(l3))
print(l3)
l4=list()   #創建一個空列表
print(type(l4))
print(l4)



運行結果:
<class 'list'>
[]
<class 'list'>
[100]
<class 'list'>
[2, 5, 5, 8, 1, 3]
<class 'list'>
[]
Process finished with exit code 0

列表常用操作1

  • 訪問
    • 使用下標操作(索引)
    • 列表的位置是從0開始的(規定列表最後一個下標爲 -1)
  • 分片操作
    • 對列表進行任意一段的截取
    • list [ : ] (截取範圍是從冒號前到冒號後,但是冒號後的數字取不到)
      (冒號前後可以爲空,前爲空表示從位置0開始,後爲空表示截止最大數加一,即截取到最後一個數據)
    • list [ : : ] (第二個冒號表示增長幅度,默認增長幅度爲1,即一個一個增長,如果此數爲負值,則表示順序爲從右往左)
#下標訪問列表
l=[2,3,5,4,1,6]
print(l)
print(l[4])  #提取下標數字
print(l[2:4])   #提取從下標二到下標三
print(l[ :5])  #提取從第一個到下標四
print(l[2:])  #提取從下標二到最後一個
print(l[ : :2])  #從第一個到最後一個間隔爲2
print(l[-2:-5])  #下面顯示爲空是因爲分片默認順序是從左往右,正常情況下冒號左邊的數要小於右邊的數
print(l[-5:-2])
print(l[-2:-5:-1])  #如果非要這麼寫,則需要吧步長寫爲負數,但是截取的結果也是顛倒的



運行結果:
[2, 3, 5, 4, 1, 6]
1    #提取下標數字
[5, 4]    #提取從下標二到下標三
[2, 3, 5, 4, 1]    #提取從第一個到下標四
[5, 4, 1, 6]   #提取從下標二到最後一個
[2, 5, 1]    #從第一個到最後一個間隔爲2
[]
[3, 5, 4]
[1, 4, 5]
Process finished with exit code 0

分片操作是生成一個新的list

  • 內置函數id,負責顯示一個變量或者數據的唯一確定編號
l=[2,5,3,8,4,6]
ll=l[:]
l[1]=100
#l 和 ll 不是同一個列表
print(id(l))
print(id(ll))
print(l)
print(ll)



運行結果:
287737405960
287737406024
[2, 100, 3, 8, 4, 6]
[2, 5, 3, 8, 4, 6]
Process finished with exit code 0

list(列表)操作2

  • del 刪除命令
    • del一個變量後,此變量將無法在使用
#del案例
l=[2,5,3,8,4,6]
print(id(l))
del l[2]
print(id(l))
print(l)



運行結果:
770037604872
770037604872    #運行del函數後不會形成一個新的list,仍然是原來那個
[2, 5, 8, 4, 6]
Process finished with exit code 0
  • 列表相加
    • 使用加號連接兩個列表
#列表相加案例
a=[1,2,3,4]
b=[5,6,8]
c=['a', 'b', 'c']
d=a+b+c
print(d)



運行結果:
[1, 2, 3, 4, 5, 6, 8, 'a', 'b', 'c']
Process finished with exit code 0
  • 列表數乘
    • 列表直接跟整數相乘,相當於把n個列表連在一起
#列表數乘案例
a=[1,2,3,4]
b=a*3
print(b)



運行結果:
[1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4]
Process finished with exit code 0
  • 成員資格運算
    • 就是判斷一個元素是否在list中
a=[1,2,3,4]
b=3
c=b in a
print(c)



運行結果:
True
  • 列表的遍歷
    • for
    • while (一般不用while訪問列表)
#列表遍歷案例:
a=[1,2,3,4]
for i in a:
    print(i)
b=['i love sunyue']
for i in b:
    print(i)
print("#"*20)


#以下是while用法
l=len(a)
n=0  #n表示列表的下標
while n<l:
    print(a[n])
    n += 1



運行結果:
1
2
3
4
i love sunyue
####################
1
2
3
4
Process finished with exit code 0
  • 雙層列表循環
#a爲嵌套列表,又稱雙層列表
a=[["one",1],["two",2],["three",3]]
for k,v in a:
    print(k,"---",v)



運行結果:
one --- 1
two --- 2
three --- 3
Process finished with exit code 0

列表內涵:list content

  • 通過簡單方法創建列表
#用for創建
a=[x for x in range(1,6 )]
b=[i for i in a]  #對於a中得每一個元素,逐個放入到b中
print(b)
c=[i*10 for i in a]   #將a中得每一個元素乘10 ,再逐個放入到c中
print(c)
d=[m for m in a if m % 2 ==0]   #過濾:將a中得偶數提取出來放到d中
print(d)
f=[m+n for m in a for n in b]   #相當於兩個for循環嵌套,且同樣可以使用條件表達式
print(f)



運行結果:
[1, 2, 3, 4, 5]
[10, 20, 30, 40, 50]
[2, 4]
[2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8, 5, 6, 7, 8, 9, 6, 7, 8, 9, 10]
Process finished with exit code 0
  • 一些題外話
#傳值和傳址的區別
#對於簡單的數值,採用傳值操作,即在函數內對參數的操作不影響外面的變量
#對於複雜變量,採用的是傳地址操作,此時函數內的和外面的數據是同一份,不管在哪裏更改都會影響其內容
def a(n):
    n[2]=300
    print (n)
    return None

def b(n):
    n += 100
    print (n)
    return None

an=[1,2,3,4,5,6,7]
bn=9

print(an)
a(an)  #傳址,會對其中的數值進行修改
print(an)

print(bn)
b(bn)   #傳值,只會改變傳過來的數據,但不會改變原始數據
print (bn)



運行結果:
[1, 2, 3, 4, 5, 6, 7]
[1, 2, 300, 4, 5, 6, 7]
[1, 2, 300, 4, 5, 6, 7]
9
109
9

關於列表的函數

len(): 表示列表的長度

cmp(list1,list2):比較兩個列表的元素

max(): 表示列表中的最大值(同理還有min)

list():將其他形式的數據轉換爲list(前提是可以轉換)

zip():將序列中的元素按照順序進行配對組成一個元組,然後將這些元組放到新的序列當中。

  • zip()函數返回的是zip類型,需要用list()函數進行轉換
names = ['吳承恩', '羅貫中', '施耐庵', '曹雪芹']
books = ['西遊記', '三國演義', '水滸傳', '紅樓夢']
times = ['1501年-1582年', '1330年—1400年', '1296年—1370年', '1715年-1763年']
books_info = zip(names, books, times)
print(list(books_info))

# 輸出:[('吳承恩', '西遊記', '1501年-1582年'), ('羅貫中', '三國演義', '1330年—1400年'), ('施耐庵', '水滸傳', '1296年—1370年'), ('曹雪芹', '紅樓夢', '1715年-1763年')]

append(): 表示插入一個內容,在末尾追加

sort():將列表元素排序

index(x):返回第一次出現x元素的索引值

a = [i for i in range(1,5)]
print(a)
a.append(100)
print(a)



運行結果:
[1,2,3,4]
[1,2,3,4,100]

insert(): 表示指定位置插入

括號中需要定義兩個值,一個表示位置下標,一個表示插入值
insert(index,data)插入的值是index的前面

a = [i for i in range(1,5)]
print(a)
a.insert(2,50)
print(a)



運行結果:
[1, 2, 3, 4]
[1, 2, 50, 3, 4]

del 刪除:它是根據索引(元素所在位置)來刪除

str=[1,2,3,4,5,2,6]
del str[1]	#刪除下標爲1的元素
print(str)
[1, 3, 4, 5, 2, 6]

str=[0,1,2,3,4,5,6]
del str[2:4] #刪除從第2個元素開始,到第4個爲止的元素(但是不包括尾部元素)
print(str)
[0, 1, 4, 5, 6]

pop():從隊尾拿出一個元素,即吧最後一個元素取出來,括號裏也可以輸入指定下標

remove(x):在列表中刪除第一次出現的元素x

clear():清空

#列表的刪除實例
a = [i for i in range(1,10)]
print(a)
print(id(a))

#pop刪除實例
last_del=a.pop()   #通常pop用於賦值
print("提取出來的值爲:",last_del)
print(a)
print(id(a))   #id一樣,說明是同一個列表
b = a.pop(6)
print("提取出來下標爲6的值爲:",b)
print(a)
print(id(a))

#remove刪除實例
a.remove(2)   #刪除a中數值爲2的元素
print(a)
print(id(a))   #id一樣,說明是同一個列表

#clear清空實例
a.clear()   #清空一個列表
print(a)
print(id(a))   #id一樣,說明是同一個列表



運行結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
722993177096
提取出來的值爲: 9
[1, 2, 3, 4, 5, 6, 7, 8]
722993177096
提取出來下標爲6的值爲: 7
[1, 2, 3, 4, 5, 6, 8]
722993177096
[1, 3, 4, 5, 6, 8]
722993177096
[]
722993177096

reverse 翻轉列表內容

#列表的翻轉實例
a = [i for i in range (1,10)]
print(a)
print(id(a))
a.reverse()
print(a)
print(id(a))    #id一樣,說明是同一個列表



運行結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
292435288584
[9, 8, 7, 6, 5, 4, 3, 2, 1]
292435288584

extend 擴展列表,將兩個列表中的一個直接拼接到另一個的後面

#列表的擴展實例
a = [i for i in range (1,10)]
b = [i for i in range (10,15)]
print(a)
print(id(a))
a.extend(b)
print(a)
print(id(a))



運行結果:
[1, 2, 3, 4, 5, 6, 7, 8, 9]
62002192904
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
62002192904

count 查找列表中指定值或者元素的個數

#列表的count實例
a = [1,2,5,3,5,4,5,1,2,1]
print(a)
print(id(a))
n= int(input("請輸入數字:"))   #input輸入的是字符,需要轉換爲int類型
b = a.count(n)
print("列表中{}的個數爲:".format(n),b)



運行結果:
[1, 2, 5, 3, 5, 4, 5, 1, 2, 1]
637753188872
請輸入數字:5
列表中5的個數爲: 3

copy 拷貝, 淺拷貝

a = [1,2,3,4,5]
print(a)
b = a   #list類型,簡單賦值操作,是傳地址
b[3] = 77
print("更改b的值後a的值爲:",a)
print("a的ID地址爲:",id(a))
print("更改b的值後b的值爲:",b)
print("b的ID地址爲:",id(b))
print("*"*20)
#拷貝實例
b = a.copy()
print("a的值爲:",a)
print("a的ID地址爲:",id(a))
print("b的值爲:",b)
print("b的ID地址爲:",id(b))  #copy之後ID地址發生改變
print("*"*20)
b[3] = 88
print("更改b的值後a的值爲:",a)
print("更改b的值後b的值爲:",b)



運行結果:
[1, 2, 3, 4, 5]
更改b的值後a的值爲: [1, 2, 3, 77, 5]
a的ID地址爲: 33841672
更改b的值後b的值爲: [1, 2, 3, 77, 5]
b的ID地址爲: 33841672
********************
a的值爲: [1, 2, 3, 77, 5]
a的ID地址爲: 33841672
b的值爲: [1, 2, 3, 77, 5]
b的ID地址爲: 34328264
********************
更改b的值後a的值爲: [1, 2, 3, 77, 5]
更改b的值後b的值爲: [1, 2, 3, 88, 5]
  • 深拷貝和淺拷貝的區別
  • 深拷貝需要特定的工具
a0 = [10,20,30]
a = [1,2,3,a0]
b = a.copy()
print(id(a[3]))
print(id(b[3]))  #拷貝以後b中a0的地址沒有發生變化
a[3][2] = 666
#淺拷貝,只拷貝一層內容
#也就是說,b拷貝的是a,而b中的a0還是指向原地址,所以改變b中a0的值後,a中a0的值也發生改變
print(a)
print(b)



運行結果:
4809224
4809224
[1, 2, 3, [10, 20, 666]]
[1, 2, 3, [10, 20, 666]]

元組-tuple

  • 元組可以看成是一個不可更改的list
  • tuple寫在一個小括號裏,元素之間用逗號隔開。
  • 元組的元素不可變,但是可以包含可變對象,如list。
  • 元組可以用作字典的鍵,也可以作爲集合的元素,但是列表就不可以,包含列表的元組也不可以。

元組創建

#創建空元組
t = ()
print(type(t))
<class 'tuple'>
#創建一個只有一個值的元組
t = (1,)
print(type(t))
print(t)
<class 'tuple'>
(1,)

t = 1,
print(type(t))
print(t)
<class 'tuple'>
(1,)

# 創建多個值得元組
t = 1,2,3,4,5
print(type(t))
print(t)
<class 'tuple'>
(1, 2, 3, 4, 5)

#使用其他結構創建
l = [1,2,3,4]
t = tuple(l)
print(type(t))
print(t)
<class 'tuple'>
(1, 2, 3, 4)

元組的特性

  • 是序列表,有序
  • 元組數據值可以訪問,不能修改
  • 元組數據可以是任意類型
  • 總之,list所有特性,除了可修改,元組都具有。 也就意味着,list具有的一些操作,比如索引,分片,序列相加,相乘,成員資格操作等都一模一樣

生成器表達式

gen = (2**i for i in range(8))  #創建一個生成器對象
#生成器使用一次後就用完了,之後再次使用就是空的
print(gen)
print((gen)) #轉換爲列表
print(tuple(gen))


gen = (2**i for i in range(8))
print(next(gen))    #使用next()函數訪問下一個元素
print(next(gen))
for item in gen:    #使用for循環訪問剩下的所有元素
    print(item,end = ' ')


gen的輸出結果爲: <generator object <genexpr> at 0x000001D43FF88E48>
list(gen)的輸出結果爲: [1, 2, 4, 8, 16, 32, 64, 128]
tuple(gen)的輸出結果爲: ()
第一次結果爲: 1
第二次結果爲: 2
剩餘所有結果爲:
4 8 16 32 64 128 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章