python之collections模塊(OrderDict,defaultdict)


前言:

import collections
print([name for name in dir(collections) if not name.startswith("_")])
['AsyncIterable', 'AsyncIterator', 'Awaitable', 'ByteString', 'Callable', 'ChainMap', 'Container', 'Coroutine', 
'Counter', 'Generator', 'Hashable', 'ItemsView', 'Iterable', 'Iterator', 'KeysView', 'Mapping', 'MappingView', 'MutableMapping', 'MutableSequence', 'MutableSet', 'OrderedDict', 'Sequence', 'Set', 'Sized', 'UserDict', 'UserList', 'UserString', 'ValuesView', 'abc', 'defaultdict', 'deque', 'namedtuple']

 常用:

a)Counter: 計數器,用於統計元素的數量

b)OrderDict:有序字典

c)defaultdict:值帶有默認類型的字典

d)namedtuple:可命名元組,通過名字來訪問元組元素

e)deque :雙向隊列,隊列頭尾都可以放,也都可以取(與單向隊列對比,單向隊列只能一頭放,另一頭取)

3.from colllections import OrderDict

python自帶的字典是按key 的hash排序,所以大家都認為map是無序的。但是python的collections模塊有一個OrderDict類。是一個有順序的map.

創建

a=OrderedDict()
b=OrderedDict({2:'b',1:'c'})

m={2:'b',1:'c'}

print(a,b,m)

# OrderedDict() 
# OrderedDict([(1, 'c'), (2, 'b')])
# {1: 'c', 2: 'b'}
#同樣是保存了幾個元素,但是使用OrderedDict會根據放入元素的先后順序進行排序。所以輸出的值是排好序的。

方法

map里面的操作他都有

區別map

d2={}
d2['a']='A'
d2['b']='B'
d2['c']='C'

d3={}
d3['c']='C'
d3['a']='A'
d3['b']='B'

print(d2 == d3)=>true

 

d4=collections.OrderedDict()
d4['a']='A'
d4['b']='B'
d4['c']='C'

d5=collections.OrderedDict()
d5['c']='C'
d5['a']='A'
d5['b']='B'

print (d1==d2)=>False

其他

dd = {'banana': 3, 'apple':4, 'pear': 1, 'orange': 2}
# sorted(dd.items(), key=lambda t: t[1])==>[('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)]

#按key排序
kd = OrderedDict(sorted(dd.items(), key=lambda t: t[0]))
print(kd)
#按照value排序
vd = OrderedDict(sorted(dd.items(),key=lambda t:t[1]))
print(vd)

#輸出
OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])

 4.defaultdict 帶有默認值(None)的字典

為什么要有一個帶有默認值的字典。因為當我使用普通的字典時,用法一般是dict={},添加元素的只需要dict[element] =value即,調用的時候也是如此,dict[element] = xxx,但前提是element字典里,如果不在字典里就會報錯。

defaultdict就能排上用場了,defaultdict的作用是在於,當字典里的key不存在但被查找時,返回的不是keyError而是一個默認值,這個默認值依賴於構造參數。

int=>0

str=>""

set=>set()

list=>[]......

from collections import defaultdict

dict1 = defaultdict(int)
print(dict1[1])
#結果是0
# 利用defaultdict給列表去重, 非原序
def string_duplicate_3(self, s):
    # 按照之前的順序
    from collections import defaultdict
    a = defaultdict()
    for x in s:
        a[x] = 0
    return a.keys()

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM