python之collections

参考链接:https://blog.csdn.net/chenxuan5849/article/details/100792575

一,ordereddict

OrderedDict类似于正常的词典,只是它记住了元素插入的顺序,当迭代它时,返回它会根据插入的顺序返回。
小知识点:


from collections import OrderedDict   

dict1 = dict()  # 普通字典
dict2 = OrderedDict()  # 有序字典

1,和正常字典相比,它是”有序”的(插入的顺序)。
2,如果重写已经存在的key,原始顺序保持不变,如果删除一个元素再重新插入,那么它会在末尾。
3,可以使用排序函数,将普通字典变成OrderedDict。
sorted参见:https://blog.csdn.net/java276582434/article/details/90812971

二,defaultdict

参考链接:https://blog.csdn.net/real_ray/article/details/17919289
在Python中如果访问字典中不存在的键,会引发KeyError异常。这时可以使用defaultdict(提供了默认值功能),defaultdict其它功能与dict一致。
defaultdict类就好像是一个dict,但是它是使用一个类型来初始化的:

>>> from collections import defaultdict
>>> dd = defaultdict(list)
>>> dd
defaultdict(<type 'list'>, {})

1,defaultdict类的初始化函数接受一个 【类型】 作为参数,当所访问的键不存在的时候,可以实例化一个值作为默认值。一个类型可以是dict,list,int,str等

from collections import defaultdict
l=defaultdict(list)
i=defaultdict(int)
s=defaultdict(str)
d=defaultdict(dict)
se=defaultdict(set)
fl=defaultdict(float)
print(l,l['a'])
print(i,i['a'])
print(s,s['a'])
print(d,d['a'])
print(se,se['a'])
print(fl,fl['a'])
#打印结果
defaultdict(<class 'list'>, {'a': []}) []
defaultdict(<class 'int'>, {'a': 0}) 0
defaultdict(<class 'str'>, {'a': ''}) 
defaultdict(<class 'dict'>, {'a': {}}) {}
defaultdict(<class 'set'>, {'a': set()}) set()
defaultdict(<class 'float'>, {'a': 0.0}) 0.0

2,defaultdict类除了接受类型名称作为初始化函数的参数之外,还可以使用任何 【不带参数的可调用函数】 ,到时该函数的返回结果作为默认值

from collections import defaultdict
def zero():
    return 4
dd = defaultdict(zero)
print(dd)
print(dd['foo']) #这一步将foo键赋值上了值
print(dd)

#打印结果
defaultdict(<function zero at 0x0164B810>, {})
4
defaultdict(<function zero at 0x0164B810>, {'foo': 4})

defaultdict实现的原理参见链接:https://blog.csdn.net/real_ray/article/details/17919289

三,counter

参考:https://blog.csdn.net/langb2014/article/details/100032436
1,创建counter

cnt = Counter()  #传入空的Counter
print(cnt)
c1 = Counter('gallahad') # 传入一个可iterable对象(list、tuple、dict、字符串等)创建
print(c1)
c2 = Counter({'red': 4, 'blue': 2})  # 传进字典
print(c2)
c3 = Counter(cats=4, dogs=8)         # 传进元组
print(c3)
print(dict(c3)) #可使用dict将counter对象转化成字典
#打印结果
Counter()
Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})
Counter({'red': 4, 'blue': 2})
Counter({'dogs': 8, 'cats': 4})
{'cats': 4, 'dogs': 8} #counter对象转化成字典

2,计数值的访问与缺失的键
当所访问的键不存在时,返回0,而不是KeyError;否则返回它的计数。

c1 = Counter('gallahad')                 # 传进字符串
print(c1['l'])
print(c1['c'])  #没有该键,返回0
#打印结果
2
0

3,计数器的更新(update和subtract)
可以使用一个iterable对象或者另一个Counter对象来更新键值。
增加使用update()方法,减少则使用subtract()方法
计数器的更新(update)

c1 = Counter('gallahad')
print(c1["a"])
c1.update('alh')
print(c1["a"])
#打印结果
3
4

计数器的更新(subtract)

c1 = Counter('gallahad')
print(c1["d"])
c1.subtract('ssaddd')  #原本有1个d,这里的字符串里有3个d,则减少后的值是1-3=-2
print(c1["d"])
#打印结果
1
-2

4, 键的删除
当计数值为0时,并不意味着元素被删除,删除元素应当使用del

c1 = Counter('gallahad')
print(c1)
del c1['a']
print(c1)
#打印结果
Counter({'a': 3, 'l': 2, 'g': 1, 'h': 1, 'd': 1})
Counter({'l': 2, 'g': 1, 'h': 1, 'd': 1})

5,elements()
返回一个迭代器。元素被重复了多少次,在该迭代器中就包含多少个该元素。元素排列无确定顺序,个数小于1的元素不被包含。

c1 = Counter('gallahad')
print(c1.elements())  #返回一个迭代器
print(list(c1.elements()))
#打印结果:
<itertools.chain object at 0x036A1190>
['g', 'a', 'a', 'a', 'l', 'l', 'h', 'd']

6,most_common([n])
返回一个元组列表。如果n没有被指定,则返回所有元素,有指定n时,返回前n个元组。当多个元素计数值相同时,排列是无确定顺序的。

c1 = Counter('gallahhadd')
print(c1.most_common())
print(c1.most_common(3))  #返回前3个元组
#打印结果
[('a', 3), ('l', 2), ('h', 2), ('d', 2), ('g', 1)]
[('a', 3), ('l', 2), ('h', 2)]

其它方法可以使用dir方法查看

四,namedtuple

User = namedtuple('User', ['name', 'sex', 'age']) # 定义一个namedtuple类型User,并包含name,sex和age属性。
user1 = User(name='name1', sex='male', age=18) # 创建一个User对象
user2 = User._make(['name2', 'male1', 21]) # 也可以通过一个list来创建一个User对象,这里注意需要使用"_make"方法
print('user1:', user1)
print('user2:', user2)
#打印结果:
user1: User(name='name1', sex='male', age=18)
user2: User(name='name2', sex='male1', age=21)


print(user1.age) # 使用点号获取属性
print('user1._asdict():', user1._asdict()) # 将User对象转换成字典,注意要使用"_asdict"
name_dict = {'name': 'name3', 'sex': 'male', 'age': 20} # 字典转换成namedtuple
print('dict2namedtuple:', User(**name_dict))
user3 = user1._replace(age=22) # 修改对象属性,注意要使用"_replace"方法
print(user3)

#打印结果
user1._asdict(): OrderedDict([('name', 'name1'), ('sex', 'male'), ('age', 18)])
dict2namedtuple: User(name='name3', sex='male', age=20)
User(name='name1', sex='male', age=22)

你可能感兴趣的:(python)