對映名稱到序列元素

2021-10-01 23:39:36 字數 3651 閱讀 9264

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

collections.namedtuple() 函式通過使用乙個普通的元組物件來幫你解決這個問

題。這個函式實際上是乙個返回 python 中標準元組型別子類的乙個工廠方法。你需要

傳遞乙個型別名和你需要的字段給它,然後它就會返回乙個類,你可以初始化這個類,

為你定義的字段傳遞值等。**示例:

>>

>

from collections import namedtuple

>>

> subscriber = namedtuple(

'subscriber',[

'addr'

,'joined'])

>>

> sub = subscriber(

'[email protected]'

,'2012-10-19'

)>>

> sub

subscriber(addr=

'[email protected]'

, joined=

'2012-10-19'

)>>

> sub.addr

'[email protected]'

>>

> sub.joined

'2012-10-19'

>>

>

儘管 namedtuple 的例項看起來像乙個普通的類例項,但是它跟元組型別是可交換

的,支援所有的普通元組操作,比如索引和解壓。比如:

>>

>

len(sub)

2>>

> addr, joined = sub

>>

> addr

'[email protected]'

>>

> joined

'2012-10-19'

>>

>

命名元組的乙個主要用途是將你的**從下標操作中解脫出來。因此,如果你從數

據庫呼叫中返回了乙個很大的元組列表,通過下標去操作其中的元素,當你在表中添

加了新的列的時候你的**可能就會出錯了。但是如果你使用了命名元組,那麼就不

會有這樣的顧慮。

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

def

compute_cost

(records)

: total =

0.0for rec in records:

total += rec[1]

* rec[2]

return total

下標操作通常會讓**表意不清晰,並且非常依賴記錄的結構。下面是使用命名元

組的版本:

from collections import namedtuple

stock = namedtuple(

'stock',[

'name'

,'shares'

,'price'])

defcompute_cost

(records)

: total =

0.0for rec in records:

s = stock(

*rec)

total += s.shares * s.price

return total

命名元組另乙個用途就是作為字典的替代,因為字典儲存需要更多的記憶體空間。如

果你需要構建乙個非常大的包含字典的資料結構,那麼使用命名元組會更加高效。但

是需要注意的是,不像字典那樣,乙個命名元組是不可更改的。比如:

>>

> s = stock(

'acme'

,100

,123.45

)>>

> s

stock(name=

'acme'

, shares=

100, price=

123.45

)>>

> s.shares =

75traceback (most recent call last)

:file ""

, line 1,in

attributeerror: can't set attribute

>>

>

如果你真的需要改變然後的屬性,那麼可以使用命名元組例項的 _rplace() 方法,

它會建立乙個全新的命名元組並將對應的字段用新的值取代。比如:

>>

> s = s._replace(shares=75)

>>

> s

stock(name=

'acme'

, shares=

75, price=

123.45

)>>

>

_replace() 方法還有乙個很有用的特性就是當你的命名元組擁有可選或者缺失字

段時候,它是乙個非常方便的填充資料的方法。你可以先建立乙個包含預設值的原型

元組,然後使用 replace() 方法建立新的值被更新過的例項。比如:

from collections import namedtuple

stock = namedtuple(

'stock',[

'name'

,'shares'

,'price'

,'date'

,'time'])

# create a prototype instance

stock_prototype = stock('',

0,0.0,

none

,none

)# function to convert a dictionary to a stock

defdict_to_stock

(s):

return stock_prototype._replace(

**s)

下面是它的使用方法:

>>

> a =

>>

> dict_to_stock(a)

stock(name=

'acme'

, shares=

100, price=

123.45

, date=

none

, time=

none

)>>

> b =

>>

> dict_to_stock(b)

stock(name=

'acme'

, shares=

100, price=

123.45

, date=

'12/17/2012'

, time=

none

)>>

>

最後要說的是,如果你的目標是定義乙個需要更新很多例項屬性的高效資料結構,

那麼命名元組並不是你的最佳選擇。這時候你應該考慮定義乙個包含 slots 方法的

1 18對映名稱到序列元素

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

找到對映序列

給出了兩個a和b的列表,從a對映到b,b是由a的一種回文構詞法構成通過隨機化a中元素的順序來實現的。我們想要找到乙個指數對映p,從a到b,對映p i j表示a出現在b中的第i個元素。這些列表a和b可能包含重複。如果有多個答案,輸出任何乙個。樣例1 輸入 a 12,28,46,32,50 和 b 50...

python 序列和對映 如何區分序列和對映

我想對乙個引數執行乙個操作,這個引數可能是乙個類似於對映的物件或乙個類似於序列的物件。我知道沒有一種策略是100 可靠的型別檢查,但我正在尋找乙個健壯的解決方案。在 基於這個answer,我知道如何確定某個東西是否是乙個序列,我可以在檢查物件是否是乙個對映之後進行這個檢查。在def ismap ar...