(九)Python中的collections模块

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工厂函数,返回一个类型为typenametuple派生类,新返回的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'}

参考资料

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值