【Python基础】Python的元组,没想象的那么简单
Python的元組與列表類似,元組一旦創(chuàng)建,元組中的數(shù)據(jù)一旦確立就不能改變,不能對元組中中的元素進行增刪改操作,因此元組沒有增加元素append、更新元素update、彈出元素pop等相關(guān)方法,只有簡單的索引和計數(shù)的方法。
?
列表不能作為字典的key, 而元組可以;列表不能做為集合的項,而元組可以。列表是不可哈希unhashable的,列表元素可以被動態(tài)改變,所以沒有一個固定不變的哈希值-這與集合要求的元素唯一性沖突;而元組的元素被禁止更新,其哈希值在整個生命周期都不會變化,因此可以成為集合的元素。
?
元組中可以包含任何數(shù)據(jù)類型,也可以包含另一個元組,如:T=(1,2,3,('a','b'))
空元組(沒有元素的元組):T=(),含1個元素的元組:T=(1,),注意有逗號,多個元素的元組:T=(1,2,3)
?
一、元組的創(chuàng)建
可以用多種方式構(gòu)建元組,主要有以下四種,每個都會有相應(yīng)的案例:
使用一對圓括號來表示空元組:?()
使用一個后綴的逗號來表示單元組:?a,?或?(a,)
使用以逗號分隔的多個項:?a,?b,?c?or?(a,?b,?c)
使用內(nèi)置的?tuple():?tuple()?或?tuple(iterable)
'''1、使用一對圓括號來表示空元組: ()''' num_tuple = (1, 2, 3)'''2、使用一個后綴的逗號來表示單元組: a, 或 (a,)''' a = 'a', a ('a',) type(a) tuple'''3、使用以逗號分隔的多個項: a, b, c or (a, b, c)''' t = 1,2,3 t (1, 2, 3) type(t) tuple t = 1,2,3,#結(jié)尾多一個逗號也沒事,一樣的效果'''4、使用內(nèi)置的 tuple(): tuple() 或 tuple(iterable)''' t = (1, 2, 3) t = tuple([1, 2
注意:使用元組的時候,如果只有一個元素記得加上一個逗號,不然就是一條賦值語句。
#表達式?一個賦值語句 t = (1) #用type查看下類型,是整數(shù)類型,并不是tuple類型 type(t) intt = (1,) #加逗號元組
二、元組的方法
由于元組并不能夠像列表一樣修改,因此元組并沒有特別多的方法,就兩個方法,count和index。
print(dir(tuple)) ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index'] 1、index作用:tuple的index方法:獲取指定元素的下標(就近原則,從左往右,找到第一個就結(jié)束)
用法:index(self, value, start=None, stop=None)
參數(shù):
value-待查詢下標的元素
start-查詢起始下標
stop-查詢終止下標(查詢到stop前一個下標) ?
2、count
作用:獲取指定元素在元組中出現(xiàn)的次數(shù)
用法:count(self, value) ?
參數(shù):value-待查詢出現(xiàn)次數(shù)的元素
t.count('a') 2 t.count(5) 13、其他操作
先生成兩個元組備用
s1=(1,2,3) s2=('a','b','c')1)拼接生成新元組
'''拼接生成新元組''' s1+s2 (1, 2, 3, 'a', 'b', 'c') s1.__add__(s2) (1, 2, 3, 'a', 'b', 'c')2)是否包含
'''是否包含''' 2 in s1 True? s1.__contains__('a') False s2.__contains__('a') True3)獲取元素
'''獲取元素''' s1[0] 1 s2.__getitem__(0) 'a'4)獲取長度
'''獲取長度 ''' len(s1) 3 s1.__len__() 35)重復(fù)拼接
'''重復(fù)拼接''' s1*3 (1, 2, 3, 1, 2, 3, 1, 2, 3)6)刪除元組
元祖中的元素值不可以修改和刪除,但是我們可以使用 del 關(guān)鍵字刪除整個元組。
t= ("a", "b", "c") del t t name 't' is not defined7)最大最小值
t= (10, 22, 0, 15, 40) max(t) 40 min(t) 0?
三、命名元組
對于元組,這個特性,我認為,才是元組存在的意義所在。只講命名元組,可能不太好理解。如果稱之為帶字段名的記錄,你可能就清楚了。
這里舉個例子,但是實現(xiàn)帶字段名,需要另一個庫(collections)的支持,你需要導(dǎo)入它。
from collections import namedtuple #生成一個City類 City = namedtuple("City", "name country polulation coordinates") #實例化 tokyo = City("Tokyo", 'JP', '36.93', ('35.68','139,69')) print(tokyo) City(name='Tokyo', country='JP', polulation='36.93', coordinates=('35.68', '139,69')) print(tokyo.name) Toky看著有點像字典,是不是,但是他不是字典(獲取數(shù)值的方法也與字典不同),字典是可變。元組在創(chuàng)建后,就無法再對其進行修改。這在某個程度上說明元組適合存放那些無需修改的數(shù)據(jù)。比如上面的,地名,國家,經(jīng)緯度。
除了上面的用法之處,這里還要介紹一些元組自己專有的屬性。
# 打印字段名 print(City._fields) ('name', 'country', 'polulation', 'coordinates')# 生成新實例 LatLong = namedtuple('LatLong', 'lat long') Xiamen_tuple = ('Xiemen', 'China', '40,54', LatLong(24.26,118.03)) Xiamen = City._make(Xiamen_tuple)print(Xiamen) City(name='Xiemen', country='China', polulation='40,54', coordinates=(24.26, 118.03))# 將具名元組轉(zhuǎn)為OrderDict Xiamen_dict = Xiamen._asdict() print(Xiamen_dict) OrderedDict([('name', 'Xiemen'), ('country', 'China'), ('polulation', '40,54'), ('coordinates', LatLong(lat=24.26, long=118.03))])總結(jié)一下,元組是一種很強大的可以當作記錄來用的數(shù)據(jù)類型,這才是他存在的價值和意義所在。而為人所熟知的,它的第二個角色才是充當一個不可變的列表。(以上都是個人看法,如有不同見解,歡迎留言討論)
?
四、與列表的比較
類似的問題, 建議移步 StackOverflow 或者 python doc。
https://stackoverflow.com/questions/626759/whats-the-difference-between-lists-and-tuples
https://docs.python.org/zh-cn/3/library/stdtypes.html#sequence-types-list-tuple-range
翻譯部分觀點如下:
1、Tuples are immutable, lists are mutable.
元組是不可變的, 而列表是可變的。
?
2、Tuples are heterogeneous data structures, lists are homogeneous sequences. Tuples have structure, lists have order.
元組通常由不同的數(shù)據(jù),而列表是相同類型的數(shù)據(jù)隊列。元組表示的是結(jié)構(gòu),而列表表示的是順序。舉個例子來講:當你想記錄棋盤上一個子的坐標時, 應(yīng)該使用元組; 當你想記錄棋盤上所有的子的坐標(一系列相同的數(shù)據(jù))時,應(yīng)該使用列表。
# 表示一個點 point = (1, 2)# 表示一系列點 points = [(1, 2), (1, 3), (4, 5)]3、 You can't use list as a dictionary identifier.
你不能將列表當作字典的key, 而元組可以。
a = (1, 2) b = [4, 5]c = {a: 'start point'} # OK {(1, 2): 'start point'} c = {b: 'end point'} # Error?
4、Due to the smaller size of a tuple operation with it a bit faster but not that much to mention about until you have a huge amount of elements.
由于元組支持的操作比列表小, 所以元組會比列表稍稍快上那么一丟丟。但是除非你有巨量的數(shù)據(jù)要去處理,否者這一點不需要特別強調(diào)。
往期精彩回顧適合初學(xué)者入門人工智能的路線及資料下載機器學(xué)習(xí)及深度學(xué)習(xí)筆記等資料打印機器學(xué)習(xí)在線手冊深度學(xué)習(xí)筆記專輯《統(tǒng)計學(xué)習(xí)方法》的代碼復(fù)現(xiàn)專輯 AI基礎(chǔ)下載機器學(xué)習(xí)的數(shù)學(xué)基礎(chǔ)專輯 本站qq群704220115,加入微信群請掃碼:總結(jié)
以上是生活随笔為你收集整理的【Python基础】Python的元组,没想象的那么简单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 雨林木风win11 32位装机版镜像v2
- 下一篇: 深度技术win11旗舰稳定版v2021.