天天看點

【Python基礎】Python的元組,沒想象的那麼簡單

Python的元組與清單類似,元組一旦建立,元組中的資料一旦确立就不能改變,不能對元組中中的元素進行增删改操作,是以元組沒有增加元素append、更新元素update、彈出元素pop等相關方法,隻有簡單的索引和計數的方法。

清單不能作為字典的key, 而元組可以;清單不能做為集合的項,而元組可以。清單是不可哈希unhashable的,清單元素可以被動态改變,是以沒有一個固定不變的哈希值-這與集合要求的元素唯一性沖突;而元組的元素被禁止更新,其哈希值在整個生命周期都不會變化,是以可以成為集合的元素。

元組中可以包含任何資料類型,也可以包含另一個元組,如:T=(1,2,3,('a','b'))

空元組(沒有元素的元組):T=(),含1個元素的元組:T=(1,),注意有逗号,多個元素的元組:T=(1,2,3)

一、元組的建立

可以用多種方式建構元組,主要有以下四種,每個都會有相應的案例:

使用一對圓括号來表示空元組: ()

使用一個字尾的逗号來表示單元組: a, 或 (a,)

使用以逗号分隔的多個項: a, b, c or (a, b, c)

使用内置的 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,#結尾多一個逗号也沒事,一樣的效果


'''4、使用内置的 tuple(): tuple() 或 tuple(iterable)'''
t = (1, 2, 3)
t = tuple([1, 2


           

注意:使用元組的時候,如果隻有一個元素記得加上一個逗号,不然就是一條指派語句。

#表達式 一個指派語句
t = (1) 
#用type檢視下類型,是整數類型,并不是tuple類型
type(t)
int


t = (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方法:擷取指定元素的下标(就近原則,從左往右,找到第一個就結束)

用法:index(self, value, start=None, stop=None)

參數:

  • value-待查詢下标的元素
  • start-查詢起始下标
  • stop-查詢終止下标(查詢到stop前一個下标)  
t=('s','a','a','r',5)
t.index('r')
3
t.index(5)
4
# index方法:根據元素找到其位置
t = (1, 2, 3, 1, 2)
t.index(1, 2)  # 尋找第2個元素1的位置
           

2、count

作用:擷取指定元素在元組中出現的次數

用法:count(self, value)  

參數:value-待查詢出現次數的元素

t.count('a')
2
t.count(5)
1
           

3、其他操作

先生成兩個元組備用

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') 
True
           

3)擷取元素

'''擷取元素'''
s1[0]
1 
s2.__getitem__(0) 
'a'
           

4)擷取長度

'''擷取長度 '''
len(s1)
3
s1.__len__()
3
           

5)重複拼接

'''重複拼接'''
s1*3
(1, 2, 3, 1, 2, 3, 1, 2, 3)
           

6)删除元組

元祖中的元素值不可以修改和删除,但是我們可以使用 del 關鍵字删除整個元組。

t= ("a", "b", "c")
del t
t
name 't' is not defined
           

7)最大最小值

t= (10, 22, 0, 15, 40)
max(t)
40
min(t)
0
           

三、命名元組

對于元組,這個特性,我認為,才是元組存在的意義所在。隻講命名元組,可能不太好了解。如果稱之為帶字段名的記錄,你可能就清楚了。

這裡舉個例子,但是實作帶字段名,需要另一個庫(collections)的支援,你需要導入它。

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
           

看着有點像字典,是不是,但是他不是字典(擷取數值的方法也與字典不同),字典是可變。元組在建立後,就無法再對其進行修改。這在某個程度上說明元組适合存放那些無需修改的資料。比如上面的,地名,國家,經緯度。

除了上面的用法之處,這裡還要介紹一些元組自己專有的屬性。

# 列印字段名
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))


# 将具名元組轉為OrderDict
Xiamen_dict = Xiamen._asdict()
print(Xiamen_dict)
OrderedDict([('name', 'Xiemen'), ('country', 'China'), ('polulation', '40,54'), ('coordinates', LatLong(lat=24.26, long=118.03))])
           

總結一下,元組是一種很強大的可以當作記錄來用的資料類型,這才是他存在的價值和意義所在。而為人所熟知的,它的第二個角色才是充當一個不可變的清單。(以上都是個人看法,如有不同見解,歡迎留言讨論)

四、與清單的比較

類似的問題, 建議移步 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.

元組通常由不同的資料,而清單是相同類型的資料隊列。元組表示的是結構,而清單表示的是順序。舉個例子來講:當你想記錄棋盤上一個子的坐标時, 應該使用元組; 當你想記錄棋盤上所有的子的坐标(一系列相同的資料)時,應該使用清單。

# 表示一個點
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.

由于元組支援的操作比清單小, 是以元組會比清單稍稍快上那麼一丢丢。但是除非你有巨量的資料要去處理,否者這一點不需要特别強調。

【Python基礎】Python的元組,沒想象的那麼簡單
往期精彩回顧



适合初學者入門人工智能的路線及資料下載下傳機器學習及深度學習筆記等資料列印機器學習線上手冊深度學習筆記專輯《統計學習方法》的代碼複現專輯
AI基礎下載下傳機器學習的數學基礎專輯
本站qq群704220115,加入微信群請掃碼: