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