1.UserDict
dict的派生类,可用来实现自定义属性的dict,如以下,定义禁止删除dict中的元素
Creating a Dictionary where
deletion is not allowed
from collections import UserDict, namedtuple, Counter, ChainMap
class MyDict(UserDict):
# Function to stop pop from
# dictionary
def pop(self, s = None):
raise RuntimeError("Deletion not allowed")
# Function to stop popitem
# from Dictionary
def popitem(self, s = None):
raise RuntimeError("Deletion not allowed")
md = MyDict()
md["name"] = "Tom"
print(md)
# md.pop("name") # RuntimeError
2.namedtuple
带命名字段的tuple工厂函数,返回一个类型为typename的tuple派生类,新返回的tuple子类可用于创建类tuple对象,
不过其带有字段属性,可通过字段属性访问,也可通过下标访问。
collections.namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)
Point = namedtuple("Point", ['x', 'y'])
p = Point(x=11, y=22)
x, y = p
print(x, y)
print(p[0], p.x)
# 11 22
# 11 11
3.Counter
Counter设计用来快速实现元素统计计数的,是dict的子类,用以给可哈希对象计数。可用来返回n最常见元素等。
两两之间还能实现+,-,&,|等运算
cnt = Counter()
for word in ['red', 'blue', 'red', 'green', 'blue', 'blue']:
cnt[word] += 1
print(cnt)
print(cnt.most_common(2))
print(cnt+cnt)
# Counter({'blue': 3, 'red': 2, 'green': 1})
# [('blue', 3), ('red', 2)]
# Counter({'blue': 6, 'red': 4, 'green': 2})
4.ChainMap
ChainMap用于将多个dict或其他mapping类型的对象组合起来生成可更新的视图,常用的属性有maps返回
所有的输入map对象,parents返回另一个ChainMap对象,不包含第一个map,new_child返回一个带新元素的
ChainMap,主要用于管理多个上下文,实际上ChainMap查询的字典实际上还是原来的字典的引用。
baseline = {'music': 'bach', 'art': 'rembrandt'}
adjustments = {'art': 'van gogh', 'opera': 'carmen'}
c = ChainMap(adjustments, baseline)
print(c.maps)
# [{'art': 'van gogh', 'opera': 'carmen'}, {'music': 'bach', 'art': 'rembrandt'}]
print(c.parents)
# ChainMap({'music': 'bach', 'art': 'rembrandt'})
nd = {"a":"b"}
nc = c.new_child(nd)
print(nc)
# ChainMap({'a': 'b'}, {'art': 'van gogh', 'opera': 'carmen'}, {'music': 'bach', 'art': 'rembrandt'})
nc['a'] = "bb"
print(nd)
# {'a': 'bb'}
本文介绍了Python标准库中collections模块下的四个实用工具:UserDict、namedtuple、Counter和ChainMap。UserDict提供了禁止从字典中删除元素的功能;namedtuple允许创建具有命名字段的元组;Counter则用于快速统计元素出现的次数;而ChainMap则是将多个字典组合成一个可更新的视图。
1522

被折叠的 条评论
为什么被折叠?



