1 18對映名稱到序列元素

2022-09-24 20:36:10 字數 2730 閱讀 8036

問題

​ 你有一段通過下標訪問列表或者元組中元素的**,但是這樣有時候會使得你的**難以閱讀,於是你想通過名稱訪問元素。

解決方案

​ collection.namedtuple()函式通過使用乙個普通的元組物件來幫你解決這個問題。這個函式實際上是乙個返回python中標準子類的乙個工廠方法。你需要傳遞又給型別名稱和你需要的字段給它,然後它就返回乙個類,你可以初始化這個類,為你定義的字段傳遞值等。**示例:

from collections import namedtuple

subscriber=namedtuple('subscriber',['addr','joined'])

sub=subscriber('[email protected]','2021-10-19')

print(sub) # ->subscriber(addr='[email protected]', joined='2021-10-19')

print(sub.addr) # ->[email protected]

print(sub.joined) # ->2021-10-19

​ 儘管namedtuple的例項看起來像乙個普通的類例項,但是它跟元組型別是可交換的,支援所有的普通元組操作,比如索引和解壓。比如:

print(len(sub))  # ->2

addr, joined = sub

print(addr) # ->[email protected]

print(joined) # ->2021-10-19

命名元組的乙個主要用途是將你的**從下標操作中解脫出來。因此,如果你從資料庫呼叫中返回了乙個很大的元組列表,通過下標去操作其中的元素,當你在表中新增了新的列的時候你的**可能會出錯了。但是如果你使用了命名元組,那麼就不會有這樣的顧慮。

為了說明清楚,下面是使用普通元組的**:

def computer_cost(records):

total=0.0

for rec in records:

total+=rec[1]*rec[2]

return total

下標操作通常會讓**表意不清楚,並且非常依賴記錄的機構。下面是使用命名元組的版本:

def computer_cost(records):

total = 0.0

for rec in records:

s = stock(*rec)

total += s.shares * s.price

return total

討論

命名元組的另乙個用途就是作為字典的替代,因為字典儲存需要更多的空間。如果你需要構建乙個非常大的包含字典的資料結構,那麼使用命名元組會更加高效。但是需要注意的是,不像字典那樣,乙個命名元組是不可更改的。比如:

s=stock(name='acme',shares=100,price=123.45)

s.shares=75 # attributeerror: can't set attribute

​ 如果你真的需要改變屬性的值,那麼可以使用命名元組例項的_replace()方法,它會建立乙個全新的命名元組並建對應的字段用新的值取代,比如:

s=s._replace(shares=75)

print(s) # ->stock(name='acme', shares=75, price=123.45)

_replace()方法還有乙個很有用的特性就是當你的命名元組擁有可選或者缺失欄位的時候,它是乙個非常方便的填充資料的方法,你可以先建立乙個包含預設值的原型元組,然後使用_replace()方法建立新的值被更新過的例項。比如:

stock = namedtuple('stock', ['name', 'shares', 'price', 'date', 'time'])

stock_prototype = stock('', 0, 0.0, none, none)

def dict_to_stock(s):

return stock_prototype._replace(**s)

下面是它的使用方法:

a = 

dict_to_stock(a)

print(dict_to_stock(a)) # ->stock(name='acme', shares=100, price=123.45, date=none, time=none)

b=print(dict_to_stock(b)) # ->stock(name='acme', shares=100, price=123.45, date='2022/02/16', time=none)

​ 最後要說的是,如果你的目標是定義乙個需要更新很多例項屬性的高效資料結構,那麼命名元組並不是你的最佳選擇。這時候你應該考慮定義乙個包含__slots__方法的類。

對映名稱到序列元素

你有一段通過下標訪問列表或者元組中元素的 但是這樣有時候會使得你的 難以閱讀,於是你想通過名稱來訪問元素。collections.namedtuple 函式通過使用乙個普通的元組物件來幫你解決這個問 題。這個函式實際上是乙個返回 python 中標準元組型別子類的乙個工廠方法。你需要 傳遞乙個型別名...

字串 1309 解碼字母到整數對映

題目 給你乙個字串 s,它由數字 0 9 和 組成。我們希望按下述規則將 s 對映為一些小寫英文本元 字元 a i 分別用 1 9 表示。字元 j z 分別用 10 26 表示。返回對映之後形成的新字串。題目資料保證對映始終唯一。示例 1 輸入 s 10 11 12 輸出 jkab 解釋 j 10 ...

遠端對映硬碟到本地

操作前提 遠端主機的資料夾的檢視裡的 使用簡單檔案共享 去掉勾選,有遠端登入賬戶密碼 操作 1 建立ipc連線 cmd中輸入net use password user administrator 2 本地計算機管理中的操作選擇連線到另外一台計算機,輸入遠端pc的ip 3 將遠端的計算機服務的teln...