首頁 >後端開發 >Python教學 >Python如何將名稱對應到序列的元素中(程式碼)

Python如何將名稱對應到序列的元素中(程式碼)

不言
不言轉載
2018-10-23 16:14:242262瀏覽

這篇文章帶給大家的內容是關於Python如何將名稱映射到序列的元素中(程式碼),有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

1、需求

我們的程式碼是透過位置(即索引或下標)來存取清單會元組的,但有時候這會讓程式碼變得有些難以閱讀。我們希望可以透過名稱來存取元素,以此減少結構中對位置的依賴性。

2、解決方案

比起普通的元組,collections.namedtuple()(命名元組)只增加了極少的開銷就提供了這些便利。實際上collections.namedtuple()是一個工廠方法,它回傳的是Python中標準元組類型的子類別。我們提供給它一個類型名稱以及對應的字段,它就傳回一個可實例化的類別、為你已經定義好的字段傳入值等。

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined'])
sub=Subscriber("1782980833@qq.com","2018-10-23")
print(sub)
print(sub.addr)
print(sub.joined)
print(len(sub))
addr,joined=sub
print(addr)
print(joined)
#下面错误,以为你namedtuple是不可变的
#sub.joined="2019"

結果:

Subsciber(addr='1782980833@qq.com', joined='2018-10-23')
1782980833@qq.com
2018-10-23
2
1782980833@qq.com
2018-10-23

儘管namedtuple的實例看起來就像一個普通的類別實例,但它的實例與普通的元組是可互換的,而且支援所有普通元組所支援的操作。

命名元組的主要作用在於將程式碼同它所控制的元素位置間解耦。所以,如果從資料庫呼叫中得到了一個大型的元組列表,而且透過元素的位置來存取元素,那麼假如在表單中新增了一列數據,那麼程式碼就會崩潰,但如果首先將返回的元組轉換為命名元組,就不會有問題。

為了說明這個問題,以下有一些使用普通元組的程式碼:

def compute_cost(records):
    total=0.0
    for rec in records:
        total+=rec[1]*rec[2]
    return total

透過位置來引用元素常常使得程式碼的表達力不夠強,而且也很依賴記錄的具體結構。

下面是使用命名元組的版本:

from collections import namedtuple
Stock=namedtuple('Stock',['name','shares','price'])
def compute_cost(records):
    total=0.0
    for rec in records:
        s=Stock(*rec)
        total+=s.shares*s.price
    return total

3、分析

namedtuple的一種可能用法是作為字典的替代,後者需要更多的空間來儲存。因此,如果要建立設計字典的大型數據,使用namedtuple會更加高效,但是請注意,與字典不同的是,namedtuple是不可變的。

如果需要修改任何屬性,可以透過使用namedtuple實例_replace()方法來實現。此方法會建立一個全新的命名元組,並對對應的值做替換。

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined'])
sub=Subscriber("1782980833@qq.com","2018-10-23")

print(sub)

sub=sub._replace(joined="2018-10-24")
print(sub)

結果:

Subsciber(addr='1782980833@qq.com', joined='2018-10-23')
Subsciber(addr='1782980833@qq.com', joined='2018-10-24')

_replace()方法有一個微妙的用途,那就是它可以作為一種簡單的方法填充具有可選或缺失字段的命名元組。要做到這一點,先建立一個包含預設值得原型數組,然後使用_replace()方法建立一個新的實例,把對應的值替換掉。

from collections import namedtuple
Subscriber=namedtuple('Subsciber',['addr','joined','age'])
sub=Subscriber("",None,0)

def dict_to_stock(s):
    return sub._replace(**s)

a={"addr":"111111@qq.com","joined":"1111-11-11","age":11}
a=dict_to_stock(a)
print(a)

b={"addr":"111111@qq.com","joined":"1111-11-11"}
b=dict_to_stock(b)
print(b)

結果:

Subsciber(addr='111111@qq.com', joined='1111-11-11', age=11)
Subsciber(addr='111111@qq.com', joined='1111-11-11', age=0)

最後,也是相當重要的是,應該要注意如果我們的目標是定義一個高效的資料結構,而且將來會修改各種實例屬性,那麼使用namedtuple並不是最佳選擇,相反,可以考慮頂一個使用了__slots__屬性的類別。

#

以上是Python如何將名稱對應到序列的元素中(程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:segmentfault.com。如有侵權,請聯絡admin@php.cn刪除