Python之collections容器数据类型
? ?在介紹collections之前,大都知道python中已經(jīng)有一些數(shù)據(jù)類型,諸如list,tuple,dict這類型,而collections可以理解對上述類型的一個擴(kuò)展。下面介紹一下collections中常用到的幾種數(shù)據(jù)類型
1.namedtuple()
python中的tuple是可迭代的,可哈希的,但是不可修改
name_list = ("python","java","php") for name in name_list:print(name)name_dict = {} name_dict[name_list]="result" print(name_dict)# 元組的拆包功能 name_list = ("小明",29,175) name,age,height = name_list name ,*other = name_list print(other)回歸了tuple之后,我們介紹一下namedtuple的功能
描述一個人的特點的時候,我們會使用姓名,年齡,身高這些屬性attribute去描述,自然的會創(chuàng)建一個類,如下
class Person():def __init__(self,name,age,height):self.name = nameself.age = ageself.height = height但如果只是為了創(chuàng)建一個包含某些屬性的數(shù)據(jù)機(jī)構(gòu)的時候,使用上面的類的創(chuàng)建方式會非常浪費空間內(nèi)存,而且代碼較為繁瑣,此時就可以使用collections中的namedtuple創(chuàng)建一個類,因此如果是創(chuàng)建一些簡單的對象的時候就可以使用namedtuple
from collections import namedtuplePerson = namedtuple("Person",["name","age","height"]) user = Person(name = "jack",age=29,height=175) print(user.name,user.age,user.height)# 函數(shù)變量參數(shù) user_tuple = ("rose",28,165) user2 = Person(*user_tuple) # user_dict ={"name":"rose2","age":15,"height":160 } user3 = Person(**user_dict)#使用namedtuple中自帶的_make函數(shù),傳入一個可迭代對象,包括list,dict,tuple user4 = Person._make(user_tuple)#既然是對象的屬性值,肯定是可以表示成字典的形式,因此如果需要將其表示為字典 user_info_dict = user._asdict()2.defaultdict
? ? ? ?常見一種統(tǒng)計個數(shù)的功能,str.count() 方法用于統(tǒng)計字符串里某個字符出現(xiàn)的次數(shù),那如果是list結(jié)構(gòu)中的想統(tǒng)計個數(shù),可能會以如下的形式進(jìn)行統(tǒng)計,比如統(tǒng)計每個成績段的個數(shù)
grade = ["a","a","b","c"] grade_dict = {} for index in grade:if index not in grade_dict:grade_dict[index] = 1else:grade_dict[index] += 1print(grade_dict)#這個時候可以做如上優(yōu)化 grade = ["a","a","b","c"] grade_dict = {} for index in grade:user_dict.setdefault(index,0)user_dict[index] += 1但是一般我們可能想不到使用setdefault這個功能,這個時候就需要defaultdic這個功能了,我們知道在Python3中如果在字典中索引一個不存在的key會報錯提示key-value的錯誤,因此使用defaultdict[key]的時候就不會報key-value的錯誤了
from collections import defaultdictgrade = ["a","a","b","c"] grade_dict = defaultdict(int) for index in grade:grade_dict[index] += 1 print(grade_dict)這個最大的用處就是我們函數(shù)中經(jīng)常出現(xiàn)判斷如果傳入了參數(shù),就是用傳入的參數(shù),沒有傳入使用默認(rèn)參數(shù)的形式,如下
def function(newDic = {}):# 使用sql查詢一個比如某個信息info值,如果傳入了info則使用傳入的值,否則使用查詢的值""""""temp = defaultdict(dict)temp.update(newDic)newDic = tempprint(info if not newDic['info'] else newDic['info'])另一種用法就是,比如在傳入?yún)?shù)的時候,如果傳入了屬性,則使用傳入的屬性值,如果沒有傳入則使用默認(rèn)值和上述的參數(shù)傳遞大同小異
def generate_dict():return {"name":"","age":0}default_dict = defaultdict(generate_dict) default_dict['xiaoming'] print(default_dict)3.deque
? ? ?queue是Python3的隊列,常用以下方式進(jìn)行引入
from queue import Queue雙端隊列deque顧名思義就是可以在隊列兩邊進(jìn)行操作的隊列,比如append,leftappend,使用之前導(dǎo)入對應(yīng)的包
from collections import deque具體的有哪些函數(shù)可以調(diào)用,可以導(dǎo)入包之后進(jìn)行查看,因為可調(diào)用的函數(shù)較多,這里不再一一介紹,這里想介紹的是在隊列(或者雙端隊列,或者列表)中,常用的一種拷貝方式,深拷貝與淺拷貝
先來看一下淺拷貝
import copy from collections import dequeuser_deque = (["boy1","boy2","boy3"]) #淺拷貝 user_deque2 = user_deque.copy()#淺拷貝,如果對應(yīng)的元素是不可變元素,如tuple中的元素,則復(fù)制該元素,如果是可變的元素,如list,就會直接指向該元素 user_deque2[1]="boy5" print(id(user_deque),id(user_deque2)) print(user_deque,user_deque2)#如果傳入一個可變的元素 user_deque = (["boy1",["boy2","boy4"],"boy3"]) #淺拷貝 user_deque2 = user_deque.copy() user_deque2[1].append("boy5") print(user_deque,user_deque2)輸出結(jié)果是:
2813269021384 2813269021832 ['boy1', 'boy2', 'boy3'] ['boy1', 'boy5', 'boy3'] ['boy1', ['boy2', 'boy4', 'boy5'], 'boy3'] ['boy1', ['boy2', 'boy4', 'boy5'], 'boy3']淺拷貝后,發(fā)現(xiàn)兩個的id不一樣。由于user_deque中的每個元素是字符串,即是不可變元素,所以如果是淺拷貝的話,就會是復(fù)制該元素,所以user_deque[1]的值變化了,但是user_deque沒有變化。但如果是user_deque中的第二個元素變成了list,即是可變的,就會使得ID指向該新的元素
#如果傳入一個可變的元素 user_deque = (["boy1",["boy2","boy4"],"boy3"]) #淺拷貝 # user_deque2 = user_deque.copy() #深拷貝 user_deque2 = copy.deepcopy(user_deque) user_deque2[1].append("boy5") print(user_deque,user_deque2)深拷貝簡單的理解是兩個獨立的變量,一個變化不會影響另一個變量,故而有如下結(jié)論:
- 如果源對象只有一級目錄的話,源做任何改動,不影響深淺拷貝對象
- 如果源對象不止一級目錄的話,源做任何改動,都要影響淺拷貝,但不影響深拷貝
4.Counter
統(tǒng)計出現(xiàn)的次數(shù),對比字符串中統(tǒng)計函數(shù)count功能
from collections import Countergrade = ["A","A","B","C","B"] grade_counter = Counter(grade) print(grade_counter)# 統(tǒng)計字符串中的個數(shù) str = "uipeadsfakndfakadf" str_counter = Counter(str) print(str_counter) # 合并之后進(jìn)行統(tǒng)計 str_counter.update("sdkfnaksd") print(str_counter)# top n的問題,前n個出現(xiàn)次數(shù)最多的 print(str_counter.most_common(2))?
總結(jié)
以上是生活随笔為你收集整理的Python之collections容器数据类型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python之lxml处理xml
- 下一篇: pytorch基础函数学习