python集合模块-------collections

collections是Python内建的一个集合模块,提供了许多有用的集合类。

目录

1.namedtuple

2.deque

3.defaultdict

4.OrderedDict

5.ChainMap

6.conuter


1.namedtuple

namedtuple是一个函数,它用来创建一个自定义的tuple对象,并且规定了tuple元素的个数,并可以用属性或者索引来引用tuple的某个元素。

这样一来,我们用namedtuple可以很方便地定义一种数据类型,它具备tuple的不变性,又可以根据属性来引用,使用十分方便。同时,namedtuple生成的类型可以直接调用_asdict()方法转换成字典。

示例

from collections import namedtuple
Point = namedtuple('point',['x','y'])
p = Point(10,20)
print(p,p[0],p[1],p.x,p.y)
d = p._asdict()  
print(d,d['x'],d['y'])

2.deque

deque就是双端队列,可以很方便的在头尾插入或者删除元素。(注意:创建双端队列时可以通过maxlen参数指定队列的容量,不指定的话默认可以无限增长)

    append(...)
 |      队列右端插入一个元素
 |  
 |  appendleft(...)
 |      队列左端插入一个元素
 |  
 |  clear(...)
 |      删除队列中所有元素
 |  
 |  copy(...)
 |      复制该队列
 |  
 |  count(...)
 |      D.count(value) -> integer -- 统计某个元素出现次数
 |  
 |  extend(...)
 |      用输入的迭代器元素扩展队列右边
 |  
 |  extendleft(...)
 |      用输入的迭代器元素扩展队列左边
 |  
 |  index(...)
 |      D.index(value, [start, [stop]]) -> integer -- 查找某个元素第一次出现的位置,找不到会报错
 |  
 |  insert(...)
 |      D.insert(index, object) -- 在某个位置插入一个元素
 |  
 |  pop(...)
 |      删除并且返回最右边元素
 |  
 |  popleft(...)
 |       删除并且返回最左边元素
 |  
 |  remove(...)
 |      D.remove(value) -- 删除第一个等于该值的元素
 |  
 |  reverse(...)
 |      D.reverse() -- 反转队列
 |  
 |  rotate(...)
 |      双端队列右移n步,默认为1;若n为负数,则左移

示例

from collections import namedtuple,deque
x = deque([3,4],maxlen=5)       #创建容量为5的队列,内容为[3,4]的队列
x.extend([5])                  #在队列右边扩展一个数5,此时队列变为[3,4,5]

x.extendleft([2,1])             #在队列左边扩展元素[1,2],此时队列变为[1,2,3,4,5];想想为什么不是extendleft([1,2])   
print(x)

3.defaultdict

使用dict时,如果引用的Key不存在,就会抛出KeyError。如果希望key不存在时,返回一个默认值,就可以用defaultdict。

创建defaultdict时需要传给他一个默认参数,这个参数要求为函数(也可以是int,list等类型)或者lambda表达式,但不能直接传入一个值,建议用lambda表达式。

d = defaultdict(lambda:'0')  #默认值为0
d['x'] = 10
print(d['x'],d['y'])

4.OrderedDict

使用dict时,Key是无序的。在对dict做迭代时,我们无法确定Key的顺序OrderedDict的Key会按照插入的顺序排列,不是Key本身排序。

OrderedDict 内部维护着一个根据键插入顺序排序的双向链表。每次当一个新的元素插入进来的时候, 它会被放到链表的尾部。对于一个已经存在的键的重复赋值不会改变键的顺序。

需要注意的是,一个 OrderedDict 的大小是一个普通字典的两倍,因为它内部维护着另外一个链表。 所以如果你要构建一个需要大量 OrderedDict 实例的数据结构的时候(比如读取 100,000 行 CSV 数据到一个 OrderedDict 列表中去), 那么你就得仔细权衡一下是否使用 OrderedDict 带来的好处要大过额外内存消耗的影响。

from collections import OrderedDict

od = OrderedDict([('a', 1), ('c', 2), ('b', 3)])

5.ChainMap

  ChainMap可以把一组dict串起来并组成一个逻辑上的dictChainMap本身也是一个dict,但是查找的时候,会按照顺序在内部的dict依次查找。什么时候使用?我们需要在字典1中查询一个变量,如果找不到就去字典2里面查找等等这种情况

from collections import ChainMap

dict1 = {'color': 'red','user': 'guest'}
dict2 = {'color': 'blue','user': 'root'}
dict3 = {'color': 'black','user': 'admib'}

combined = ChainMap(dict1,dict2,dict3)
print(combined['color'])

print(combined['user'])

6.conuter

Counter是一个简单的计数器,其实就是默认值为0的一个字典子类。例如,统计字符出现的个数:

from collections import Counter
c = Counter()
for ch in 'programming':
    c[ch] = c[ch] + 1
print(c)

高级示例:

from collections import Counter
words = [
    'look', 'into', 'my', 'eyes', 'look', 'into', 'my', 'eyes',
    'the', 'eyes', 'the', 'eyes', 'the', 'eyes', 'not', 'around', 'the',
    'eyes', "don't", 'look', 'around', 'the', 'eyes', 'look', 'into',
    'my', 'eyes', "you're", 'under'
]

word_counts = Counter(words)
# 出现频率最高的3个单词
top_three = word_counts.most_common(3)
print(top_three)
# Outputs [('eyes', 8), ('the', 5), ('look', 4)]

猜你喜欢

转载自blog.csdn.net/goodxin_ie/article/details/89311568
今日推荐