Python的collections模組提供了很多高階的資料結構,使得我們在處理資料時能夠更加方便和高效。下面我們將詳細講解collections模組中各個類的功能,並給出相應的樣例。
- 匯入模組
首先,我們需要匯入collections模組:
import collections
2. Counter
Counter是一個字典子類,用於計數可雜湊物件。這裡我們用它來統計各國出現的次數。
from collections import Counter
一個包含各國名稱的列表
countries = ['China', 'USA', 'India', 'China', 'Brazil', 'USA', 'India', 'Russia', 'China']
使用Counter來統計每個國家出現的次數
country_counts = Counter(countries)
列印統計結果
print(country_counts)
輸出可能是:Counter({'China': 3, 'USA': 2, 'India': 2, 'Brazil': 1, 'Russia': 1})
找出出現次數最多的國家
most_common_country = country_counts.most_common(1)
print(most_common_country)
輸出可能是:[('China', 3)]
計算兩個Counter的合併
other_countries = ['Japan', 'Germany', 'USA', 'China']
other_counts = Counter(other_countries)
combined_counts = country_counts + other_counts
print(combined_counts)
輸出可能是:Counter({'China': 4, 'USA': 3, 'India': 2, 'Brazil': 1, 'Russia': 1, 'Japan': 1, 'Germany': 1})
從一個Counter中減去另一個Counter
country_counts -= Counter(['India', 'Brazil'])
print(country_counts)
輸出可能是:Counter({'China': 3, 'USA': 2, 'Russia': 1})
- deque
deque是一個雙端佇列,支援從兩端新增和刪除元素。
from collections import deque
建立一個deque物件
d = deque()
d.append('China')
d.append('USA')
d.appendleft('India')
print(d) # 輸出:deque(['India', 'China', 'USA'])
從右端彈出元素
print(d.pop()) # 輸出:'USA'
從左端彈出元素
print(d.popleft()) # 輸出:'India'
4. defaultdict
defaultdict是一個字典子類,提供了預設值。
from collections import defaultdict
建立一個使用list作為預設值的defaultdict
dd = defaultdict(list)
dd['Asia'].append('China')
dd['Asia'].append('India')
dd['America'].append('USA')
print(dd) # 輸出:defaultdict(<class 'list'>, {'Asia': ['China', 'India'], 'America': ['USA']})
建立一個使用int作為預設值的defaultdict
dd_int = defaultdict(int)
print(dd_int['Europe']) # 輸出:0
5. namedtuple
namedtuple用於建立一個簡單的類,用於儲存具有固定欄位的資料。
from collections import namedtuple
建立一個名為Country的namedtuple,包含name和population兩個欄位
Country = namedtuple('Country', ['name', 'population'])
建立一個Country物件
china = Country(name='China', population=1400000000)
訪問欄位
print(china.name) # 輸出:'China'
print(china.population) # 輸出:1400000000
非常抱歉,確實沒有寫完。下面是OrderedDict和ChainMap的完整樣例,以及collections模組的總結。
- OrderedDict
OrderedDict是一個保持元素插入順序的字典。
from collections import OrderedDict
建立一個OrderedDict物件
od = OrderedDict()
od['Asia'] = ['China', 'India']
od['America'] = ['USA', 'Brazil']
od['Europe'] = ['Russia', 'Germany']
遍歷有序字典
for continent, countries in od.items():
print(continent, countries)
輸出可能是:
Asia ['China', 'India']
America ['USA', 'Brazil']
Europe ['Russia', 'Germany']
移動元素到開頭
od.move_to_end('Asia', last=False)
print(od) # 輸出:OrderedDict([('Asia', ['China', 'India']), ('America', ['USA', 'Brazil']), ('Europe', ['Russia', 'Germany'])])
彈出元素
popped_item = od.popitem(last=False)
print(popped_item) # 輸出可能是:('Asia', ['China', 'India'])
print(od) # 輸出:OrderedDict([('America', ['USA', 'Brazil']), ('Europe', ['Russia', 'Germany'])])
7. ChainMap
ChainMap用於建立一個包含多個字典的單一檢視,可以在多個字典中查詢鍵。
from collections import ChainMap
建立兩個字典
dict1 = {'China': 'Asia', 'USA': 'America'}
dict2 = {'India': 'Asia', 'Brazil': 'America', 'Russia': 'Europe'}
使用ChainMap合併這兩個字典
chained_dict = ChainMap(dict1, dict2)
訪問鍵
print(chained_dict['China']) # 輸出:'Asia' (優先從dict1中查詢)
print(chained_dict['India']) # 輸出:'Asia' (從dict1中未找到,則從dict2中查詢)
print(chained_dict['Russia']) # 輸出:'Europe' (只在dict2中找到)
修改ChainMap中的值
chained_dict['China'] = 'New Asia'
print(chained_dict['China']) # 輸出:'New Asia'
新增新值
chained_dict['Japan'] = 'Asia'
print(chained_dict['Japan']) # 輸出:'Asia'
鏈中的字典可以動態變化
new_dict = {'Australia': 'Oceania'}
chained_dict.maps.append(new_dict)
print(chained_dict['Australia']) # 輸出:'Oceania'
collections模組總結
collections模組為Python提供了許多有用的資料結構,這些資料結構擴充套件了Python內建的資料型別,使得處理複雜資料更加高效和方便。
• Counter:用於計數可雜湊物件,返回一個字典,鍵是元素,值是計數。
• deque:雙端佇列,支援從兩端新增和刪除元素,適用於需要頻繁在兩端進行操作的場景。
• defaultdict:帶有預設值的字典,當訪問字典中不存在的鍵時,返回預設值,而不是引發錯誤。
• namedtuple:用於建立一個簡單的類,用於儲存具有固定欄位的資料,比直接使用字典更節省空間。
• OrderedDict:保持元素插入順序的字典,可以記住元素新增的順序。
• ChainMap:建立一個包含多個字典的單一檢視,可以在多個字典中查詢鍵,並按順序訪問它們。
這些資料結構在特定應用場景中提供了更加高效和直觀的處理方式,是Python程式設計師處理複雜資料的強大工具。根據具體需求,可以選擇合適的資料結構來最佳化程式碼。