python3 - collections模块

目录

collections模块:-----  python内建的一个集合模块,提供各类集合类

namedtuple:函数创建自定义元祖类型

deque:适用于队列和栈,高校实现了插入和删除的双向列表,进行左右添删操作

defaultdict:字典类型,若查找的key不存在,不报错而返回默认值。

OrderedDict:字典类型,保持字典内key顺序按照插入的顺序排列

Counter:字典类型,查询对象的出现次数,以字典方式存储

ChainMap:管理多个映射对象,对外表现单独的映射结构


collections模块:-----  python内建的一个集合模块,提供各类集合类

 

namedtuple:函数创建自定义元祖类型

# 创建元组表示点的坐标
point = collections.namedtuple('point',['x','y'])
p = point(1,2)
print(p.x,p.y)
# 创建元组表示圆的坐标和半径
circle = collections.namedtuple('circle',['x','y','r'])
c = circle(0,0,4)
print(c.x,c.y,c.r)

deque:适用于队列和栈,高校实现了插入和删除的双向列表,进行左右添删操作

# 创建deque类型的列表
deq = collections.deque(['a','b','c'])
print(deq)
# 正常插入右端数据
deq.append(1)
print(deq)
# 插入左端数据
deq.appendleft(2)
print(deq)
# 正常删除右端数据
deq.pop()
print(deq)
# 删除左端数据
deq.popleft()
print(deq)

defaultdict:字典类型,若查找的key不存在,不报错而返回默认值。

'''
defaultdict 字典类型,若查找的key不存在,不报错而返回默认值。
    defaultdict类的初始化函数接受一个类型作为参数,当所访问的键不存在的时候,可以实例化一个值作为默认值
'''
# first argument must be callable or None
dd = collections.defaultdict(list)
# dd = collections.defaultdict(lambda: 'N/A')

print(dd)  # defaultdict(<class 'list'>, {})
dd['a'] = 123
print(dd['a'])  # 123
print(dd['b'])  # []

OrderedDict:字典类型,保持字典内key顺序按照插入的顺序排列

'''
OrderedDict 字典类型,保持字典内key顺序按照插入的顺序排列。
    注:OrderedDict的大小是普通字典的2倍多,因为它额外创建了链表
'''
l = [('a', 1), ('b', 2), ('c', 3)]
# 初始化一个od类型字典
od = collections.OrderedDict(l)
print(od)
# OrderedDict([('a', 1), ('b', 2), ('c', 3)])

od['d'] = 4
print(od)
# OrderedDict([('a', 1), ('b', 2), ('c', 3), ('d', 4)])

print(type(od))
# <class 'collections.OrderedDict'>

print(od.values())
# odict_values([1, 2, 3, 4])

print(od.keys())
# odict_keys(['a', 'b', 'c', 'd'])

print(od.items())
# odict_items([('a', 1), ('b', 2), ('c', 3), ('d', 4)])

print(od['a']) # 1

Counter:字典类型,查询对象的出现次数,以字典方式存储

'''
Counter 字典类型,简单的计数器(记录查询对象出现的次数,以字典方式存储)
    c = Counter(计算对象)
    c[任何可哈希对象作为输入]
'''
# 简单计算字符串中出现的字符,自增
c = collections.Counter()
print(c)  # Counter()
for ch in 'hello python':
    c[ch] = c[ch] + 1
print(c)

# 简单的计算字符串中出现的字符,update()更新
c = collections.Counter('hello python')
print(c)
# Counter({'h': 2, 'l': 2, 'o': 2, 'e': 1, ' ': 1, 'p': 1, 'y': 1, 't': 1, 'n': 1})

c.update('hello world!')
print(c)
# Counter({'l': 5, 'o': 4, 'h': 3, 'e': 2, ' ': 2, 'p': 1, 'y': 1, 't': 1, 'n': 1, 'w': 1, 'r': 1, 'd': 1, '!': 1})

# 筛选符合条件次数的keys
words = ['a', 'hello', 'my', 'wold', 'around', 'the', 'hello', 'look', 'a']
word_c = collections.Counter(words)
# 用 most_common 筛选出现两次的单词
top_two = word_c.most_common(2)
print(top_two)  # [('a', 2), ('hello', 2)]

# 使用数学运算符,进行字典运算
a = collections.Counter('hello')
b = collections.Counter('hello,python')
print(a, b)
# Counter({'l': 2, 'h': 1, 'e': 1, 'o': 1})
# Counter({'h': 2, 'l': 2, 'o': 2, 'e': 1, ',': 1, 'p': 1, 'y': 1, 't': 1, 'n': 1})

c = a + b
print(c)
# Counter({'l': 4, 'h': 3, 'o': 3, 'e': 2, ',': 1, 'p': 1, 'y': 1, 't': 1, 'n': 1})

d = b - a
print(d)
# Counter({'h': 1, 'o': 1, ',': 1, 'p': 1, 'y': 1, 't': 1, 'n': 1})

ChainMap:管理多个映射对象,对外表现单独的映射结构

'''
ChainMap 管理多个映射对象,在一个字典内创建多个映射数据,但对外表现为一个单独的映射结构。
'''
a = {'x': 1, 'z': 3}
b = {'y': 2, 'z': 4}
cm = collections.ChainMap(a, b)
print(cm)  # ChainMap({'x': 1, 'z': 3}, {'y': 2, 'z': 4})
print(cm['x'])  # 1
print(cm['y'])  # 2
# 若有重复的键,采用第一个映射中所对应的值
print(cm['z'])  # 3

print(len(cm))  # 3
print(list(cm.keys()))  # ['y', 'z', 'x']
print(list(cm.values()))  # [2, 1, 3]

# 修改映射的操作,只会作用在列出的第一个映射结构上。 即只对原主进行增删改查操作
cm['x'] = 333
cm['m'] = 444
# del cm['y'] #KeyError: "Key not found in the first mapping: 'y'"
print(cm)  # ChainMap({'x': 333, 'z': 3, 'm': 444}, {'y': 2, 'z': 4})
print(a)  # {'x': 333, 'z': 3, 'm': 444}

# maps :返回用户可更新的映射对象列表。
#       在这个列表里包括所有添加的映射对象,可以更新任何一个列表里显示的映射对象。
#       在这个属性至少会包括一个映射对象。
print(cm.maps)  # [{'x': 333, 'z': 3, 'm': 444}, {'y': 2, 'z': 4}]

# 进行修改也是对原字典进行修改
cm.maps[0]['z'] = 2222
print(cm.maps)  # [{'x': 333, 'z': 2222, 'm': 444}, {'y': 2, 'z': 4}]
print(a)  # {'x': 333, 'z': 2222, 'm': 444}

# new_child(m=None):在原来的chainmap内创建新的映射对象,m为初始字典。对子映射的修改,则只会修改新的子映射字典。
#                    可以用来创建同名子映射,用来修改值,而不会对原有属性进行修改
print(cm.new_child())
# ChainMap({}, {'x': 333, 'z': 2222, 'm': 444}, {'y': 2, 'z': 4})

cm_a = cm.new_child({'xyz':123})
cm['x'] = 0
cm_a['z'] = 9999
print(cm)  # ChainMap({'x': 0, 'z': 2222, 'm': 444}, {'y': 2, 'z': 4})
print(cm_a)
# ChainMap({'xyz': 123, 'z': 9999}, {'x': 0, 'z': 2222, 'm': 444}, {'y': 2, 'z': 4})

# 创建同名子映射,之后的修改只会对新的映射进行修改
cm = cm.new_child({'xyz': 11111})
print(cm)  # ChainMap({'xyz': 11111}, {'x': 333, 'z': 2222, 'm': 444}, {'y': 2, 'z': 4})

猜你喜欢

转载自blog.csdn.net/qq_33961117/article/details/82390129