一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python cookbook(數據結構與算法)將名稱映射到序列元素中的方法

Python cookbook(數據結構與算法)將名稱映射到序列元素中的方法

2021-01-24 00:40壟上行 Python

這篇文章主要介紹了Python cookbook(數據結構與算法)將名稱映射到序列元素中的方法,結合實例形式分析了Python使用collections.namedtuple()進行元組命名相關操作技巧,需要的朋友可以參考下

本文實例講述了Python將名稱映射到序列元素中的方法。分享給大家供大家參考,具體如下:

問題:希望通過名稱來訪問元素,減少結構中對位置的依賴性

解決方案:使用命名元組collections.namedtuple()。它是一個工廠方法,返回的是python中標準元組類型的子類,提供給它一個類型名稱以及相應的字段名稱,它就返回一個可實例化的類,為你以定義好的字段名稱傳入值等。

命名元組的主要作用在于將代碼同它所控制的元素位置間進行解耦

?
1
2
3
4
5
6
7
8
9
>>> from collections import namedtuple
>>> Sub=namedtuple('Subscriber',['addr','joined'])
>>> subscriber=Sub('[email protected]','2016-8-7')
>>> subscriber
Subscriber(addr='[email protected]', joined='2016-8-7')
>>> subscriber.addr
>>> subscriber.joined
'2016-8-7'

namedtuple的實例與普通的元組是可互換的,而且支持所有普通元組所支持的操作,例如索引和分解(unpacking).

?
1
2
3
4
5
6
7
8
>>> len(subscriber)
2
>>> addr,joined=subscriber
>>> addr
>>> joined
'2016-8-7'
>>>

使用普通元組的代碼:

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

通過位置來引用元素使得代碼的表達力不夠,而且也依賴于記錄的具體結構。

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# example.py
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
# Some Data
records = [
  ('GOOG', 100, 490.1),
  ('ACME', 100, 123.45),
  ('IBM', 50, 91.15)
]
print(compute_cost(records))

運行結果:

?
1
65912.5

補充:

如果要構建涉及字典的大型數據結構,使用namedtuple會更加有效。但是注意,與字典不同的是,namedtuple是不可變的。例如:

?
1
2
3
4
5
6
7
8
9
>>> s=Stock('ACMS',100,123.45)
>>> s
Stock(name='ACMS', shares=100, price=123.45)
>>> s.shares=75
Traceback (most recent call last):
 File "<pyshell#2>", line 1, in <module>
  s.shares=75
AttributeError: can't set attribute
>>>

若要修改屬性,可使用namedtuple實例的_replace()方法來實現。該方法會創建一個全新的命名元組,并對相應的值做替換;

?
1
2
3
4
>>> s=s._replace(shares=75)
>>> s
Stock(name='ACMS', shares=75, price=123.45)
>>>

_replace()方法一個微妙的用途是它可以作為一種簡便的方法填充具有可選或缺失字段的命名元組。

步驟:

1、創建一個包含默認值的“原型”元組;

2、使用_replace()方法創建一個新實例,把相應的值替換掉;

?
1
2
3
4
5
6
7
8
9
10
11
12
13
from collections import namedtuple
Stock = namedtuple('Stock', ['name', 'shares', 'price','date','time'])
#創建一個包含默認值的“原型”元組
stock_prototype=Stock('',0,0.0,None,None)
#創建一個函數實現將字典轉化為Stock類型
def dict_to_stock(s):
  return stock_prototype._replace(**s)
a={'name':'ACMS','shares':100,'price':123.45}
print(dict_to_stock(a))
b={'name':'ACMS','shares':100,'price':123.45,'date':'2016-08-08'}
print(dict_to_stock(b))
c={'name':'ACMS','price':123.45}
print(dict_to_stock(c))

運行結果:

?
1
2
3
Stock(name='ACMS', shares=100, price=123.45, date=None, time=None)
Stock(name='ACMS', shares=100, price=123.45, date='2016-08-08', time=None)
Stock(name='ACMS', shares=0, price=123.45, date=None, time=None)

注意:如果我們的目標是定義一個高效的數據結構,而且將來會修改各種實例屬性,那么不推薦namedtuple!

(代碼摘自《Python Cookbook》)

希望本文所述對大家Python程序設計有所幫助。

原文鏈接:http://www.cnblogs.com/apple2016/p/5747656.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久国产热视频99rev6 | 无码任你躁久久久久久久 | 强波多野结衣女教师 | 女医学护士一级毛片 | 国产日韩精品一区二区在线观看 | 五月天婷婷精品免费视频 | 暖暖日本高清 | 免费我看视频在线观看 | av在线色| 色小孩导航 | 亚洲天堂男人网 | 欧美日日操 | 9久久9久久精品 | 美女国内精品自产拍在线播放 | 短篇同学新婚h系列小说 | 精品久久久久久久久久久久久久久 | 87影院在线观看视频在线观看 | 免费在线观看a | 操碰91 | 色在线亚洲视频www 色欲麻豆国产福利精品 | 国产精品调教 | 久久er国产精品免费观看2 | 好吊色视频988gao在线观看 | 国产精品原创永久在线观看 | 粉嫩高中生第一次不戴套 | h版在线观看 | 男人天堂黄色 | 操碰97| 男人天堂新 | 国产91精选在线观看麻豆 | 性夜影院午夜看片 | 农村老少伦小说 | 四虎影音在线 | 欧美交换乱理伦片120秒 | 精品日产1区2卡三卡麻豆 | 四虎影视网站 | 欧美精品v欧洲高清 | 好姑娘在线完整版视频 | 国产精品探花一区在线观看 | 韩国伦理hd | 欧美伊人影院 |