欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

4種非常實用的python內(nèi)置數(shù)據(jù)結(jié)構(gòu)

 更新時間:2021年04月28日 16:24:51   作者:yanxiangtianji  
這篇文章主要介紹了4種非常實用的python內(nèi)置數(shù)據(jù)結(jié)構(gòu),幫助大家更好的理解和學習使用python,感興趣的朋友可以了解下

array

Python不僅僅可以使用內(nèi)置的list實現(xiàn)數(shù)組,還支持像C語言那樣的指定類型的原生數(shù)組array。
很顯然,因為list可以存儲各種類型的對象,而array只存儲一個指定的原生類型,所以當數(shù)據(jù)量較大時,原生array在內(nèi)存占用方面要比list小。
而且array不像C語言里那樣在定義時就限制了大小,它支持list所支持的各種常用函數(shù)。相比之下Python的array更像是C++的vector。

from array import array
l = list(range(100))
a = array.fromlist(l)

print(l.__sizeof__(), a.__sizeof__())

目前array有兩個限制。首先,它只支持整數(shù)、小數(shù)、unicode字符,而不能像C++的vector那樣支持多種數(shù)據(jù)類型。另外目前指定類型比較麻煩,我們需要使用類型對應(yīng)的字母縮寫來指定,而不能使用簡單的諸如int,float的方式。

a = array('i')
a.append(1)
a.append(4)
Type code  C Type Python Type Minimum size in bytes
'b' signed char int 1
'B'  unsigned char int 1
'u' wchar_t  Unicode character 2
'h'  signed short int 2
'H'  unsigned short int 2
'i' signed int int 2
'I'  unsigned int int 2
'l' signed long int 4
'L'  unsigned long int 4

更詳細的信息可以參考:https://docs.python.org/3.8/library/array.html

defaultdict

C++的map對于新的key會自動使用value type的默認構(gòu)造函數(shù)構(gòu)造一個值,而Python默認的dict對于不存在的key的訪問會拋出異常(賦值除外)。這是因為Python不知道value的類型,所以沒辦法為我們默認構(gòu)造。
defaultdict要求我們在構(gòu)造時指定一個類型,然后會自動根據(jù)需要初始化value。這樣我們就可以使用簡單的代碼來實現(xiàn)很多功能。

下面的代碼,我對比了使用defaultdict和original dict實現(xiàn)將學生按照姓的首字母分組的功能,以及分類計數(shù)的功能。

import collections
students = ['Zhang San', 'Li Si', 'Zhou liu', 'Chen qi', 'Cheng ba']
# using defaultdict
dd = collections.defaultdict(list)
for s in students:
	key = s[0]
	dd[key].append(s)
print(dd)
# using original dict (method 1)
od = {}
for s in students:
	key = s[0]
	if key not in do:
		od[key] = []
	od[key].append(s)
print(od)

scores = ['A', 'B', 'C', 'A', 'A', 'B', 'C', 'B', 'A', 'A']
# using defaultdict
dd = collections.defaultdict(int)
for s in scores :
	dd[s] += 1
print(dd)
# using original dict (method 2)
od = collections.defaultdict(int)
for s in scores :
	if s not in do:
		do[s] = 1
	else:
		do[s] += 1
print(od)

Named Tuple

編程實踐中我們經(jīng)常需要創(chuàng)建一些小的數(shù)據(jù)結(jié)構(gòu)用來整合一組相關(guān)聯(lián)的數(shù)據(jù),簡單的比如地理坐標的經(jīng)緯度,顏色的RGB值或者矩形框的左上和右下坐標,復雜的比如構(gòu)造一個窗口的一組參數(shù)。
實踐中,我們通常有3中實現(xiàn)方法:

  • 對每一個這樣的數(shù)據(jù)結(jié)構(gòu)創(chuàng)建一個class。優(yōu)點是可以直接使用名字訪問數(shù)據(jù)成員,而且支持復雜的訪問邏輯和數(shù)據(jù)操作。缺點是需要編寫對應(yīng)的類和必須的函數(shù),管理文件和引用關(guān)系。
  • 使用tuple。優(yōu)點是編寫簡單,內(nèi)存使用效率高。缺點是只能使用下標訪問,可讀性差,容易出錯。
  • 使用dict,用str來作為對于屬性的名字。優(yōu)點是編寫相對簡單,而且保留了變量的名字。缺點是需要使用字符串表示名字較為麻煩,而且每一個結(jié)構(gòu)都要保存作為名字的字符串,浪費空間。

collections的nametuple可以為我們直接構(gòu)造一個具有名字的簡單類型,方便快捷地實現(xiàn)類似手寫了一個class的效果。
需要注意的是collections.nametuple是一個factory function,它用來幫我們創(chuàng)建一個類型,而不是這個類型的具體對象。創(chuàng)建類型時,我們可以指定各個屬性的名字,之后就可以使用.來訪問了,而且它同時還支持使用下標訪問。同時Named Tuple還支持_asdict函數(shù)用來將內(nèi)部的數(shù)值轉(zhuǎn)換成一個dict。

# class
class Rect:
	def __init__(self, x1, y1, x2, y2):
		self.x1 = x1
		self.y1 = y1
		self.x2 = x2
		self.y2 = y2
		
def area_class(r):
	w = r.x2 - r.x1
	h = r.y2 - r.y1
	return w*h

r1 = Rect(1,3,5,5)
# <__main__.Rect object at 0x7fde252a87f0>
# to show its content, we need to implement __repr__(self) or __str__(self)
print(area_class(r1))

# tuple
def area_tuple(r):
	w = r[2]-r[0]
	h = r[3]-r[1]
	return w*h

r2 = (1,3,5,5)
print(r2)
# (1, 3, 5, 5)
print(area_tuple(r2))

# dict
def area_dict(r):
	w = r["x2"] - r["x1"]
	h = r["y2"] - r["y1"]
	return w*h

r3 = {"x1":1, "y1":3, "x2":5, "y2":5}
print(r3)
# {'x1': 1, 'y1': 3, 'x2': 5, 'y2': 5}
print(area_tuple(r3))

# named tuple
import collections
Rectangle = collections.namedtuple("Rectangle", ["x1", "y1", "x2", "y2"])

def area_namedtuple(r):
	w = r.x2 - r.x1
	y = r.y2 - r.y1
	return w*h

r4 = Rectangle(1,3,5,5)
print(r4)
# Rectangle(x1=1, y1=3, x2=5, y2=5)
x1,y2,x2,y2 = r4
print(x1,y2,x2,y2)
# 1 3 5 5
print(area_namedtuple(r4))
print(area_class(r4)) # work with "." grammar
print(area_tuple(r4)) # work with index
print(area_dict(r4._asdict())) # work with dict

Counter

顧名思義,Counter是用來對元素進行計數(shù)的,它也是collections這個包里的。根據(jù)Python的官方文檔,它是dict類型的一個子類。
在構(gòu)造的時候輸入一個iterable的類型,比如list,range或是一個mapping的類型,比如dict,defaultdict。然后Counter就會對其中的元素進行計數(shù)。
比較特殊的是,Counter對負數(shù)沒有做特殊處理,就是說在特殊操作下允許出現(xiàn)測試為負,后面我們會有例子。

c = Counter()                           # a new, empty counter
c = Counter('gallahad')                 # a new counter from an iterable
print(c)
# Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})
c = Counter({'red': 4, 'blue': 2})      # a new counter from a mapping
print(c)
# Counter({'red': 4, 'blue': 2})
c = Counter(cats=4, dogs=8)             # a new counter from keyword args
print(c)
# Counter({'dogs': 8, 'cats': 4})

除了基本的計數(shù)功能,它還支持一些常用的相關(guān)功能。比如:

  • 按照頻率排序(most_common([n]))。其中n是可選輸入,表示返回前n個最頻繁的元素和他們的頻率。默認情況下返回所有的元素。
  • 按照頻率輸出元素本身(elements())。它會返回元素本身,但是元素的順序不是原來的,相同的元素會連續(xù)輸出。不同元素之間,按照他們的出現(xiàn)順序輸出,這一點是OrderedDict以及3.7之后的dict所提供的特性。
  • 兩個Counter相減(substract(c))。它可以從第一個counter上減去第二個counter中對應(yīng)元素出現(xiàn)的次數(shù)。對于只出現(xiàn)在第二個coutner中元素,默認其在第一個counter中出現(xiàn)0次。
c = Counter(a=4, b=2, c=0, d=-2)
sorted(c.elements())
# ['a', 'a', 'a', 'a', 'b', 'b']
Counter('abracadabra').most_common(3)
# [('a', 5), ('b', 2), ('r', 2)]

c1 = Counter(a=4, b=2, d=-2)
c2 = Counter(a=1, b=2, c=3, d=4)
c1.subtract(c2)
c1
# Counter({'a': 3, 'b': 0, 'c': -3, 'd': -6})

更多的參考信息大家可以參考官方文檔:

https://docs.python.org/3/library/collections.html

以上就是4種非常實用的python內(nèi)置數(shù)據(jù)結(jié)構(gòu)的詳細內(nèi)容,更多關(guān)于python內(nèi)置數(shù)據(jù)結(jié)構(gòu)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Matlab、Python為工具解析數(shù)據(jù)可視化之美

    Matlab、Python為工具解析數(shù)據(jù)可視化之美

    下面介紹一些數(shù)據(jù)可視化的作品(包含部分代碼),主要是地學領(lǐng)域,可遷移至其他學科,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2021-11-11
  • PyTorch搭建一維線性回歸模型(二)

    PyTorch搭建一維線性回歸模型(二)

    這篇文章主要為大家詳細介紹了PyTorch搭建一維線性回歸模型,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • Python實現(xiàn)查找系統(tǒng)盤中需要找的字符

    Python實現(xiàn)查找系統(tǒng)盤中需要找的字符

    這篇文章主要介紹了Python實現(xiàn)查找系統(tǒng)盤中需要找的字符,涉及Python字符查找的相關(guān)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 解決python報錯ImportError:urllib3?v2.0?only?supports?OpenSSL?1.1.1+

    解決python報錯ImportError:urllib3?v2.0?only?supports?OpenSSL

    這篇文章主要介紹了解決python報錯ImportError:urllib3?v2.0?only?supports?OpenSSL?1.1.1+的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • ?分享一個Python?遇到數(shù)據(jù)庫超好用的模塊

    ?分享一個Python?遇到數(shù)據(jù)庫超好用的模塊

    這篇文章主要介紹了?分享一個Python?遇到數(shù)據(jù)庫超好用的模塊,SQLALchemy這個模塊,該模塊是Python當中最有名的ORM框架,該框架是建立在數(shù)據(jù)庫API之上,使用關(guān)系對象映射進行數(shù)據(jù)庫的操作,,需要的朋友可以參考下
    2022-04-04
  • Python的sqlite3模塊中常用函數(shù)

    Python的sqlite3模塊中常用函數(shù)

    sqlite3模塊是Python中的內(nèi)置模塊,用于與SQLite數(shù)據(jù)庫交互,本文就來介紹一下Python的sqlite3模塊中常用函數(shù),感興趣的可以了解一下
    2023-10-10
  • 徹底理解Python中的yield關(guān)鍵字

    徹底理解Python中的yield關(guān)鍵字

    今天小編就為大家分享一篇關(guān)于徹底理解Python中的yield關(guān)鍵字,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-04-04
  • python 寫一個水果忍者游戲

    python 寫一個水果忍者游戲

    這篇文章主要介紹了python 如何寫一個水果忍者游戲,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2021-01-01
  • 用python爬取今日說法每期數(shù)據(jù)

    用python爬取今日說法每期數(shù)據(jù)

    大家好,本篇文章主要講的是用python爬取今日說法每期數(shù)據(jù),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • python?math模塊使用方法介紹

    python?math模塊使用方法介紹

    math庫是python的內(nèi)置數(shù)學類函數(shù)庫,支持整數(shù)和浮點數(shù)運算,math模塊下的函數(shù),返回值均為浮點數(shù),除非有說明,math模塊提供類似C語言標準定義的數(shù)學函數(shù)
    2022-08-08

最新評論