序列:成員有序排列,可以通過下標偏移量訪問到它的一個或者幾個成員,這類類型統(tǒng)稱為序列。
序列數(shù)據(jù)包括:字符串、列表和元組類型。
特點:都支持索引和切片操作符;成員關(guān)系操作符(in,not in);連接符(+)重復操作符(*)
數(shù)組array:存儲同種數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu)。[1,2,3],[1.1,2.2,3.1]
列表list:打了激素的數(shù)組,可以存儲不同數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu)。[1,2.2,‘hello']
列表的創(chuàng)建:
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 """#返回的數(shù)據(jù)類型為bool型 布爾類型: True: 1 False: 0 """ print(1 in ["a", True, [1,2]]) #由于此處有True所以會默認認為1屬于該列表 print(1 in ["a", False, [1,2]]) #False
根據(jù)索引來返回索引到的值;
li = [1,2,3,[1,2,3]] print(li[0]) #返回數(shù)值1 print(li[-1]) #返回倒數(shù)第一個值[1, 2, 3] li1 = [1,2,3,[1,"b",3]] print(li1[-1]) #返回倒數(shù)第一個值[1, 'b', 3] print(li1[-1][0]) #返回倒數(shù)第一個元素中的第一個元值 1 print(li1[3][-1]) #返回第四個元素中的倒數(shù)第一個值 3
li = ['172','25','254','100'] print(li[:2]) #拿出列表中的前兩個元素['172', '25'] print(li[1:]) #拿出列表中的第二個到最后一個元素['25', '254', '100'] print(li[::-1]) #將列表反轉(zhuǎn)['100', '254', '25', '172']
如已知一個列表信息為 [‘172',‘25',‘254',‘100'],現(xiàn)在需要輸出'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)
通過索引和切片查看元素,查看索引值和出現(xiàn)次數(shù);
li = [1,2,3,4,3,2,3] print(li.count(1)) #查看數(shù)字1出現(xiàn)的次數(shù) print(li.index(3)) #查看元素對應的索引
根據(jù)索引刪除
li = [1,2,3] #print(li.pop(1)) #將縮索引的第一個刪除,[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),排序,復制等操作;
li =[5,4,13,20] li.reverse() print(li) #反轉(zhuǎn) [20, 13, 4, 5] li.sort() print(li) #從小到大排序[4, 5, 13, 20] #sort默認從小到大,如果想要從大到小,需要用reverse來反轉(zhuǎn) 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:帶了緊箍咒的列表,和列表的唯一區(qū)別是不能增刪改。
元組中只有一個元素時一定要添加逗號,不然會將其試做對應的信息,
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)
查看:通過索引和切片查看元素,查看索引值和出現(xiàn)次數(shù);
t = (1,4,5,2,3,4) print(t.count(4)) #統(tǒng)計4出現(xiàn)的次數(shù),返回值為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.創(chuàng)建命名元組對象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) #西安
問題: 深拷貝和淺拷貝的區(qū)別? python中如何拷貝一個對象?
賦值: 創(chuàng)建了對象的一個新的引用,修改其中任意一個變量都會影響到另一個。(=)
淺拷貝: 對另外一個變量的內(nèi)存地址的拷貝,這兩個變量指向同一個內(nèi)存地址的變量值。(li.copy(), copy.copy())
公用一個值;
這兩個變量的內(nèi)存地址一樣;
對其中一個變量的值改變,另外一個變量的值也會改變;
深拷貝: 一個變量對另外一個變量的值拷貝。(copy.deepcopy())
兩個變量的內(nèi)存地址不同;
兩個變量各有自己的值,且互不影響;
對其任意一個變量的值的改變不會影響另外一個;
nums1 = [1,2,3] nums2 = nums1 nums1.append(4) print(nums2) # [1, 2, 3, 4]
因為num1和num2指向同一個內(nèi)存空間,所以當nums1添加值時,相當于nums2也添加了值。
n1 = [1,2,3] n2 = n1.copy() #n1.copy和n1[:]都可以實現(xiàn)拷貝。 print(id(n1),id(n2)) #2708901331648 2708901331264 n1.append(4) print(n2) #n1和n2的內(nèi)存地址不同,修改并不互相影響 [1, 2, 3]
加粗樣式
有列表嵌套時,或者說列表中包含可變數(shù)據(jù)類型時,一定要選擇深拷貝.
可變數(shù)據(jù)類型(可增刪改的):列表(list)
不可變數(shù)據(jù)類型:數(shù)值,字符串(str),元組(tuple) namedtuple;變量指向內(nèi)存空間的值不會改變。
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)存地址: #最后一個元素的地址: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ū)別在于是否真正獲取一個對象的復制實體,而不是引用。
假設B復制了A,在修改A的時候,看B是否發(fā)生變化:
如果B跟著也變了,說明是淺拷貝,拿人手短!(修改堆內(nèi)存中的同一個值)
如果B沒有改變,說明是深拷貝,自食其力?。ㄐ薷亩褍?nèi)存中的不同的值)
如何實現(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])) #最后一個元素的地址:2894603422272 2894603419776 n1[-1].append(4) #n1 = [1, 2, [1, 2, 4]] print(n2) #n2 = [1, 2, [1, 2]]
在 python 語言中 :
==:判斷類型和值是否相等
is: 類型和值是否相等,內(nèi)存地址是否相等
== is和==兩種運算符在應用上的本質(zhì)區(qū)別是:
1). Python中對象的三個基本要素,分別是:id(身份標識)、type(數(shù)據(jù)類型)和value(值)。
2). is和==都是對對象進行比較判斷作用的,但對對象比較判斷的內(nèi)容并不相同。
3). ==用來比較判斷兩個對象的value(值)是否相等;(type和value)
is也被叫做同一性運算符, 會判斷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+/
快速縮進的快捷鍵:選中需要縮進的代碼+tab
快速取消縮進的快捷鍵:選中需要縮進的代碼 ,按shift+tab
練習:云主機管理系統(tǒng)
編寫一個云主機管理系統(tǒng):
- 創(chuàng)建云主機(IP,hostname,IDC)
- 搜索云主機(順序查找)
- 刪除云主機
-查看所有云主機信息
from collections import namedtuple menu = """ 云主機管理系統(tǒng) 1).添加云主機 2).搜索云主機(IP搜索) 3).刪除云主機 4).云主機列表 5). 退出系統(tǒng) 請輸入您的選擇:""" # 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循環(huán)(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}已經(jīng)刪除') 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'云主機總個數(shù)為:{count}') elif choice == '5': print("系統(tǒng)正在退出,歡迎下次使用......") exit() else: print("請輸入正確的選項!")
到此這篇關(guān)于Python內(nèi)置數(shù)據(jù)結(jié)構(gòu)列表與元組的文章就介紹到這了,更多相關(guān)Python內(nèi)置數(shù)據(jù)結(jié)構(gòu)列表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!