您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Python內(nèi)置數(shù)據(jù)結(jié)構(gòu)列表與元組的詳細(xì)介紹”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
1. 序列
2. 列表
2.1 列表的特性
2.1.1 列表的連接操作符和重復(fù)操作符
2.1.3 列表的索引
2.1.4 列表的切片
2.1.5 列表的循環(huán)(for)
2.2 列表的基本操作(增刪改查)
2.2.1 列表的增加
2.2.2 列表的修改
2.2.3 查看
2.2.4 列表的刪除
2.2.5 其他操作
3. 元組
3.1 元組的創(chuàng)建
3.2 元組的特性
3.3 元組的命名
4. 深拷貝和淺拷貝
4.1 值的引用
4.2 淺拷貝
4.3 深拷貝
5. is 和 ==的對(duì)比
總結(jié)
序列:成員有序排列,可以通過(guò)下標(biāo)偏移量訪問(wèn)到它的一個(gè)或者幾個(gè)成員,這類類型統(tǒng)稱為序列。
序列數(shù)據(jù)包括:字符串、列表和元組類型。
特點(diǎn):都支持索引和切片操作符;成員關(guān)系操作符(in,not in);連接符(+)&重復(fù)操作符(*)
數(shù)組array:存儲(chǔ)同種數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu)。[1,2,3],[1.1,2.2,3.1]
列表list:打了激素的數(shù)組,可以存儲(chǔ)不同數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu)。[1,2.2,‘hello']
列表的創(chuàng)建:
li = [] #空擴(kuò)列表 print(li, type(li)) li1 = [1] #只有一個(gè)元素的列表 print(li1, type(li1))
print([1,2] + [2,3]) #[1,2,2,3] print([1,2] *3) #[1,2,1,2,1,2]
print(1 in [1,2,3]) #True """#返回的數(shù)據(jù)類型為bool型 布爾類型: True: 1 False: 0 """ print(1 in ["a", True, [1,2]]) #由于此處有True所以會(huì)默認(rèn)認(rèn)為1屬于該列表 print(1 in ["a", False, [1,2]]) #False
根據(jù)索引來(lái)返回索引到的值;
li = [1,2,3,[1,2,3]] print(li[0]) #返回?cái)?shù)值1 print(li[-1]) #返回倒數(shù)第一個(gè)值[1, 2, 3] li1 = [1,2,3,[1,"b",3]] print(li1[-1]) #返回倒數(shù)第一個(gè)值[1, 'b', 3] print(li1[-1][0]) #返回倒數(shù)第一個(gè)元素中的第一個(gè)元值 1 print(li1[3][-1]) #返回第四個(gè)元素中的倒數(shù)第一個(gè)值 3
li = ['172','25','254','100'] print(li[:2]) #拿出列表中的前兩個(gè)元素['172', '25'] print(li[1:]) #拿出列表中的第二個(gè)到最后一個(gè)元素['25', '254', '100'] print(li[::-1]) #將列表反轉(zhuǎn)['100', '254', '25', '172']
如已知一個(gè)列表信息為 [‘172',‘25',‘254',‘100'],現(xiàn)在需要輸出'100-254-25“;
print('-'.join(li[3:0:-1])) #表示從第四個(gè)元素開(kāi)始,倒序依次拿出然后再拼接起來(lái) print('-'.join(li[:0:-1])) #表示從最后一個(gè)元素開(kāi)始,倒序依次拿出然后再拼接起來(lái) print('-'.join(li[1:][::-1])) #表示從第二個(gè)元素開(kāi)始,全部拿出之后在倒序拼接
names = ['小張','張哥','張師'] for name in names: print(f"zxk的別名是:{name}")
追加
追加默認(rèn)是在列表的最后添加;
li = [1,2,3] li.append(4) print(li) #[1, 2, 3, 4]
在列表開(kāi)頭添加
li = [1,2,3] li.insert(0,'cat') print(li) #['cat', 1, 2, 3] li = [1,2,3] li.insert(2,'cat') print(li) #在索引2前面添加cat[1, 2, 'cat', 3]
一次追加多個(gè)元素
li = [1,2,3] #添加4,5,6, li.append([4,5,6]) print(li) #[1, 2, 3, [4, 5, 6]] li.extend([4,5,6]) print(li) #[1, 2, 3, 4, 5, 6]
通過(guò)索引和切片重新賦值的方式去修改;
li = [1,2,3] li[0] = 'cat' print(li) #['cat', 2, 3] li[-1] = 'westos' print(li) #['cat', 2, 'westos'] li = [1,2,3] li[:2] = ['cat','westos'] #表示從第一個(gè)開(kāi)始修改兩個(gè)['cat', 'westos', 3] print(li)
通過(guò)索引和切片查看元素,查看索引值和出現(xiàn)次數(shù);
li = [1,2,3,4,3,2,3] print(li.count(1)) #查看數(shù)字1出現(xiàn)的次數(shù) print(li.index(3)) #查看元素對(duì)應(yīng)的索引
根據(jù)索引刪除
li = [1,2,3] #print(li.pop(1)) #將縮索引的第一個(gè)刪除,[1, 3] delete_num = li.pop(-1) print(li) print("刪除的元素是:",delete_num) #刪除的元素是: 3
根據(jù)value值刪除
li = [1,2,3] li.remove(3) print(li) #[1, 2]
全部清空
li =[1,2,3] li.clear() print(li) #[]
除了上面的之外還有反轉(zhuǎn),排序,復(fù)制等操作;
li =[5,4,13,20] li.reverse() print(li) #反轉(zhuǎn) [20, 13, 4, 5] li.sort() print(li) #從小到大排序[4, 5, 13, 20] #sort默認(rèn)從小到大,如果想要從大到小,需要用reverse來(lái)反轉(zhuǎn) li.sort(reverse=True) print(li) #從大到小排序[20, 13, 5, 4] li1 = li.copy() print(id(li),id(li1)) #復(fù)制前后兩個(gè)列表的ID不一樣 2097933779264 2097933779648 print(li,li1) #[20, 13, 5, 4] [20, 13, 5, 4]
元組tuple:帶了緊箍咒的列表,和列表的唯一區(qū)別是不能增刪改。
元組中只有一個(gè)元素時(shí)一定要添加逗號(hào),不然會(huì)將其試做對(duì)應(yīng)的信息,
t1 = () #空元組 print(t1,type(t1)) t2 = (1) #只有單個(gè)元素時(shí)不是元組,當(dāng)要是元組是要加逗號(hào) print(t2,type(t2)) #1 <class 'int'> t3 = (1,2.2,True,[1,2,3,]) print(t3,type(t3)) ##(1, 2.2, True, [1, 2, 3]) <class 'tuple'>
由于元組是帶了緊箍咒的列表,所以沒(méi)有增刪改的特性;
1. 連接符和重復(fù)操作符 print((1,2,3)+(3,)) #(1, 2, 3, 3) print((1,2,3) *2) #(1, 2, 3, 1, 2, 3) 2. 成員操作符 print(1 in (1,2,3)) #True 3. 切片和索引 t = (1,2,3) print(t[0]) #1 print(t[-1]) #3 print(t[:2]) #(1, 2) print(t[1:]) #(2, 3) print(t[::-1]) #(3, 2, 1)
查看:通過(guò)索引和切片查看元素,查看索引值和出現(xiàn)次數(shù);
t = (1,4,5,2,3,4) print(t.count(4)) #統(tǒng)計(jì)4出現(xiàn)的次數(shù),返回值為2 print(t.index(2)) #查看元素2 的,返回的索引值為3
Tuple還有一個(gè)兄弟,叫namedtuple。雖然都是tuple,但是功能更為強(qiáng)大。 collections.namedtuple(typename, field_names) typename:類名稱 field_names: 元組中元素的名稱
實(shí)例化命名元組
# import datetime # today = datetime.date.today() # print(today) tuple = ('name','age','city') #普通的元組格式,當(dāng)需要取出時(shí),需要一個(gè)一個(gè)取出信息 print(tuple[0],tuple[1],tuple[2]) # name age city
可以從collections模塊中導(dǎo)入namedtuple工具:
from collections import namedtuple #1.創(chuàng)建命名元組對(duì)象User User = namedtuple('User',('name','age','city')) #2.給命名元組傳值 user1 = User("zxk",24,"西安") #3.打印命名元組 print(user1) #User(name='zxk', age=24, city='西安') # 4. 獲取命名元組指定的信息 print(user1.name) #zxk print(user1.age) #24 print(user1.city) #西安
問(wèn)題: 深拷貝和淺拷貝的區(qū)別? python中如何拷貝一個(gè)對(duì)象?
賦值: 創(chuàng)建了對(duì)象的一個(gè)新的引用,修改其中任意一個(gè)變量都會(huì)影響到另一個(gè)。(=)
淺拷貝: 對(duì)另外一個(gè)變量的內(nèi)存地址的拷貝,這兩個(gè)變量指向同一個(gè)內(nèi)存地址的變量值。(li.copy(), copy.copy())
公用一個(gè)值;
這兩個(gè)變量的內(nèi)存地址一樣;
對(duì)其中一個(gè)變量的值改變,另外一個(gè)變量的值也會(huì)改變;
深拷貝: 一個(gè)變量對(duì)另外一個(gè)變量的值拷貝。(copy.deepcopy())
兩個(gè)變量的內(nèi)存地址不同;
兩個(gè)變量各有自己的值,且互不影響;
對(duì)其任意一個(gè)變量的值的改變不會(huì)影響另外一個(gè);
nums1 = [1,2,3] nums2 = nums1 nums1.append(4) print(nums2) # [1, 2, 3, 4]
因?yàn)閚um1和num2指向同一個(gè)內(nèi)存空間,所以當(dāng)nums1添加值時(shí),相當(dāng)于nums2也添加了值。
n1 = [1,2,3] n2 = n1.copy() #n1.copy和n1[:]都可以實(shí)現(xiàn)拷貝。 print(id(n1),id(n2)) #2708901331648 2708901331264 n1.append(4) print(n2) #n1和n2的內(nèi)存地址不同,修改并不互相影響 [1, 2, 3]
加粗樣式
有列表嵌套時(shí),或者說(shuō)列表中包含可變數(shù)據(jù)類型時(shí),一定要選擇深拷貝.
可變數(shù)據(jù)類型(可增刪改的):列表(list)
不可變數(shù)據(jù)類型:數(shù)值,字符串(str),元組(tuple) namedtuple;變量指向內(nèi)存空間的值不會(huì)改變。
n1 = [1,2,[1,2]] n2 = n1.copy() #n1和n2的內(nèi)存地址:的確拷貝了 #2859072423168 2859072422336 print(id(n1),id(n2)) #n1[-1]和n2[-1]的內(nèi)存地址: #最后一個(gè)元素的地址:2859072425664 2859072425664 print(id(n1[-1]),id(n2[-1])) n1[-1].append(4) print(n1) #[1, 2, [1, 2, 4]] print(n2) #[1, 2, [1, 2, 4]]
深拷貝和淺拷貝最根本的區(qū)別在于是否真正獲取一個(gè)對(duì)象的復(fù)制實(shí)體,而不是引用。
假設(shè)B復(fù)制了A,在修改A的時(shí)候,看B是否發(fā)生變化:
如果B跟著也變了,說(shuō)明是淺拷貝,拿人手短!(修改堆內(nèi)存中的同一個(gè)值)
如果B沒(méi)有改變,說(shuō)明是深拷貝,自食其力?。ㄐ薷亩褍?nèi)存中的不同的值)
如何實(shí)現(xiàn)深拷貝 copy.deepcopy
import copy n1 = [1,2,[1,2]] n2 = copy.deepcopy(n1) #n1和n2的內(nèi)存地址:的確拷貝了 print(id(n1),id(n2)) #2894603422016 2894603421056 #n1[-1]和n2[-1]的內(nèi)存地址: print(id(n1[-1]),id(n2[-1])) #最后一個(gè)元素的地址:2894603422272 2894603419776 n1[-1].append(4) #n1 = [1, 2, [1, 2, 4]] print(n2) #n2 = [1, 2, [1, 2]]
在 python 語(yǔ)言中 :
==:判斷類型和值是否相等
is: 類型和值是否相等,內(nèi)存地址是否相等
== is和==兩種運(yùn)算符在應(yīng)用上的本質(zhì)區(qū)別是:
1). Python中對(duì)象的三個(gè)基本要素,分別是:id(身份標(biāo)識(shí))、type(數(shù)據(jù)類型)和value(值)。
2). is和==都是對(duì)對(duì)象進(jìn)行比較判斷作用的,但對(duì)對(duì)象比較判斷的內(nèi)容并不相同。
3). ==用來(lái)比較判斷兩個(gè)對(duì)象的value(值)是否相等;(type和value)
is也被叫做同一性運(yùn)算符, 會(huì)判斷id是否相同;(id, type 和value)
print(1 == '1') #由于數(shù)據(jù)類型不一致False li = [1,2,3] li1 = li.copy() print(li == li1) #True #類型和值相等,但是內(nèi)存地址不相等 print(id(li),id(li1)) print(li is li1) #False
快速注釋代碼的快捷鍵:ctrl+/
快速縮進(jìn)的快捷鍵:選中需要縮進(jìn)的代碼+tab
快速取消縮進(jìn)的快捷鍵:選中需要縮進(jìn)的代碼 ,按shift+tab
練習(xí):云主機(jī)管理系統(tǒng)
編寫(xiě)一個(gè)云主機(jī)管理系統(tǒng):
- 創(chuàng)建云主機(jī)(IP,hostname,IDC)
- 搜索云主機(jī)(順序查找)
- 刪除云主機(jī)
-查看所有云主機(jī)信息
from collections import namedtuple menu = """ 云主機(jī)管理系統(tǒng) 1).添加云主機(jī) 2).搜索云主機(jī)(IP搜索) 3).刪除云主機(jī) 4).云主機(jī)列表 5). 退出系統(tǒng) 請(qǐng)輸入您的選擇:""" # 1. 所有云主機(jī)信息如何存儲(chǔ)?選擇哪種類型存儲(chǔ)? 選擇列表 # 2. 每個(gè)云主機(jī)信息該如何存儲(chǔ)?IP,hostname.IDC 選擇命名元組 hosts = [] Host = namedtuple('Host',('ip','hostname','idc')) while True: choice = input(menu) if choice == '1': print("添加云主機(jī)".center(50,"*")) ip = input("ip:") hostname = input("hostname:") idc = input("idc(eg:ali,huawei...):") host1 = Host(ip,hostname,idc) hosts.append(host1) print(f"添加{idc}的云主機(jī)成功。IP地址為{ip}") elif choice == '2': #怎么搜索:for循環(huán)(for..else),判斷,break print("搜索云主機(jī)".center(50,"*")) for host in hosts: ipv4 = input("please input ipv4:") if ipv4 == host.ip: print(f'{ipv4}對(duì)應(yīng)的主機(jī)為{host.hostname}') else: break elif choice == '3': print("刪除云主機(jī)".center(50,"*")) for host in hosts: delete_hostname = input("please input delete hostname:") if delete_hostname == host.hostname: hosts.remove(host) print(f'對(duì)應(yīng)的主機(jī){delete_hostname}已經(jīng)刪除') else: break elif choice == '4': print("云主機(jī)列表".center(50,"*")) print("IP\t\t\thostname\tidc") count = 0 for host in hosts: count +=1 print(f"{host.ip}\t{host.hostname}\t{host.idc}") print(f'云主機(jī)總個(gè)數(shù)為:{count}') elif choice == '5': print("系統(tǒng)正在退出,歡迎下次使用......") exit() else: print("請(qǐng)輸入正確的選項(xiàng)!")
“Python內(nèi)置數(shù)據(jù)結(jié)構(gòu)列表與元組的詳細(xì)介紹”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。