日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

Python之collections容器数据类型

發布時間:2025/3/20 python 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python之collections容器数据类型 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ?在介紹collections之前,大都知道python中已經有一些數據類型,諸如list,tuple,dict這類型,而collections可以理解對上述類型的一個擴展。下面介紹一下collections中常用到的幾種數據類型

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去描述,自然的會創建一個類,如下

class Person():def __init__(self,name,age,height):self.name = nameself.age = ageself.height = height

但如果只是為了創建一個包含某些屬性的數據機構的時候,使用上面的類的創建方式會非常浪費空間內存,而且代碼較為繁瑣,此時就可以使用collections中的namedtuple創建一個類,因此如果是創建一些簡單的對象的時候就可以使用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)# 函數變量參數 user_tuple = ("rose",28,165) user2 = Person(*user_tuple) # user_dict ={"name":"rose2","age":15,"height":160 } user3 = Person(**user_dict)#使用namedtuple中自帶的_make函數,傳入一個可迭代對象,包括list,dict,tuple user4 = Person._make(user_tuple)#既然是對象的屬性值,肯定是可以表示成字典的形式,因此如果需要將其表示為字典 user_info_dict = user._asdict()

2.defaultdict

? ? ? ?常見一種統計個數的功能,str.count() 方法用于統計字符串里某個字符出現的次數,那如果是list結構中的想統計個數,可能會以如下的形式進行統計,比如統計每個成績段的個數

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)#這個時候可以做如上優化 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)

這個最大的用處就是我們函數中經常出現判斷如果傳入了參數,就是用傳入的參數,沒有傳入使用默認參數的形式,如下

def function(newDic = {}):# 使用sql查詢一個比如某個信息info值,如果傳入了info則使用傳入的值,否則使用查詢的值""""""temp = defaultdict(dict)temp.update(newDic)newDic = tempprint(info if not newDic['info'] else newDic['info'])

另一種用法就是,比如在傳入參數的時候,如果傳入了屬性,則使用傳入的屬性值,如果沒有傳入則使用默認值和上述的參數傳遞大同小異

def generate_dict():return {"name":"","age":0}default_dict = defaultdict(generate_dict) default_dict['xiaoming'] print(default_dict)

3.deque

? ? ?queue是Python3的隊列,常用以下方式進行引入

from queue import Queue

雙端隊列deque顧名思義就是可以在隊列兩邊進行操作的隊列,比如append,leftappend,使用之前導入對應的包

from collections import deque

具體的有哪些函數可以調用,可以導入包之后進行查看,因為可調用的函數較多,這里不再一一介紹,這里想介紹的是在隊列(或者雙端隊列,或者列表)中,常用的一種拷貝方式,深拷貝與淺拷貝

先來看一下淺拷貝

import copy from collections import dequeuser_deque = (["boy1","boy2","boy3"]) #淺拷貝 user_deque2 = user_deque.copy()#淺拷貝,如果對應的元素是不可變元素,如tuple中的元素,則復制該元素,如果是可變的元素,如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)

輸出結果是:

2813269021384 2813269021832 ['boy1', 'boy2', 'boy3'] ['boy1', 'boy5', 'boy3'] ['boy1', ['boy2', 'boy4', 'boy5'], 'boy3'] ['boy1', ['boy2', 'boy4', 'boy5'], 'boy3']

淺拷貝后,發現兩個的id不一樣。由于user_deque中的每個元素是字符串,即是不可變元素,所以如果是淺拷貝的話,就會是復制該元素,所以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)

深拷貝簡單的理解是兩個獨立的變量,一個變化不會影響另一個變量,故而有如下結論:

  • 如果源對象只有一級目錄的話,源做任何改動,不影響深淺拷貝對象
  • 如果源對象不止一級目錄的話,源做任何改動,都要影響淺拷貝,但不影響深拷貝

4.Counter

統計出現的次數,對比字符串中統計函數count功能

from collections import Countergrade = ["A","A","B","C","B"] grade_counter = Counter(grade) print(grade_counter)# 統計字符串中的個數 str = "uipeadsfakndfakadf" str_counter = Counter(str) print(str_counter) # 合并之后進行統計 str_counter.update("sdkfnaksd") print(str_counter)# top n的問題,前n個出現次數最多的 print(str_counter.most_common(2))

?

總結

以上是生活随笔為你收集整理的Python之collections容器数据类型的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。