设为首页 收藏本站
查看: 801|回复: 0

[经验分享] Python -- collection 系列

[复制链接]

尚未签到

发表于 2018-8-12 12:14:31 | 显示全部楼层 |阅读模式
  collection 数据容器
  Python拥有一些内置的数据类型,比如str, int, list, tuple, dict等,
collections
  模块在这些内置数据类型的基础上,提供了几个额外的数据类型:
  namedtuple()。创建有名字域的元组子类的工厂函数。python 2.6新增。
  deque:双端队列,类似于列表,两端进栈和出栈都比较快速。python 2.4新增。
  Counter:字典的子类,用于统计哈希对象。python 2.7新增。
  OrderedDict:字典的子类,记录了添加顺序。python 2.7新增。
  defaultdict:dict的子类,调用一个工厂函数支持不存在的值。python 2.5新增。
  还提供了抽象基类,用来测试类是否提供了特殊接口,比如是哈希或者映射。
class {typename}(tuple):   # 可命名元祖  '{typename}({arg_list})'
  namedtuple主要用来产生可以使用名称来访问元素的数据对象,通常用来增强代码的可
  读性, 在访问一些tuple类型的数据时尤其好用。
    def _make(cls, iterable, new=tuple.__new__, len=len):  from collections import namedtuple
            websites = [  
                        ('Sohu', 'http://www.google.com/', '张朝阳'),
  
                        ('Sina', 'http://www.sina.com.cn/', '王志东'),
  
                        ('163', 'http://www.163.com/', '丁磊')
  
                        ]
  
            Website = namedtuple('Website', ['name', 'url', 'founder'])
  
            for website in websites:
  
                website = Website._make(website)
  
                print(website)
  结果如下:
  Website(name='Sohu', url='http://www.google.com/', founder='张朝阳')
  Website(name='Sina', url='http://www.sina.com.cn/', founder='王志东')
  Website(name='163', url='http://www.163.com/', founder='丁磊')
    def _replace(_self, **kwds):    def _asdict(self):  class Counter(dict):  # 计数器
  Counter() 的可用方法如下:
  def most_common(self, n=None): # 获取出现频率最高的几个元素
  def elements(self):   # 获取所有元素
  例:
  import collections
  c1=collections.Counter ('sdfsdgasdhgd')
  print c1
  print c1.most_common(3)
  for i in c1.elements():
  print i
  C:\Python27\python.exe "E:/python-file/learn - python.py"
  Counter({'d': 4, 's': 3, 'g': 2, 'a': 1, 'f': 1, 'h': 1})
  [('d', 4), ('s', 3), ('g', 2)]
  a
  d
  d
  d
  d
  g
  g
  f
  h
  s
  s
  s
  Process finished with exit code 0
  def update(*args, **kwds): # 有新添加的就添加到 collections.Counter()
  >>> c1
  Counter({'d': 4, 's': 3, 'g': 2, 'h': 1, 'f': 1, 'a': 1})
  >>> c2
  Counter({'a': 2, 'd': 1, 'c': 1, 'b': 1})
  >>> c1.update(c2)
  >>> c1
  Counter({'d': 5, 's': 3, 'a': 3, 'g': 2, 'h': 1, 'c': 1, 'b': 1, 'f': 1})
  def subtract(*args, **kwds):   # 相减 后 添加到  collections.Counter()
  >>> c1
  Counter({'d': 5, 's': 3, 'a': 3, 'g': 2, 'h': 1, 'c': 1, 'b': 1, 'f': 1})
  >>> c1.subtract(c2)
  >>> c1
  Counter({'d': 4, 's': 3, 'g': 2, 'h': 1, 'f': 1, 'a': 1, 'c': 0, 'b': 0})
  def copy(self):  # 浅层copy,只拷贝一层如有多层则一层之下默认指向深层地址
  class OrderedDict(dict):  #  # 有序字典
  区别无序字典及有序字典的实例:
  import collections
  c1=collections.OrderedDict ()
  c1['k1']=1
  c1['k3']=1
  c1['k5']=1
  c1['k2']=1
  print c1
  c1={}
  c1['k1']=1
  c1['k3']=1
  c1['k5']=1
  c1['k2']=1
  print c1
  结果如下:
  OrderedDict([('k1', 1), ('k3', 1), ('k5', 1), ('k2', 1)])     ---有序字典
  {'k3': 1, 'k2': 1, 'k1': 1, 'k5': 1} ---无序字典
  自定义有序字典,字典变成有序的字典
  c1={}
  c1['k1']=1
  c1['k3']=3
  c1['k5']=5
  c1['k2']=2
  print c1
  li=['k1','k2','k3','k5']
  for i in li:
  print c1
  C:\Python27\python.exe "E:/python-file/learn - python.py"
  {'k3': 3, 'k2': 2, 'k1': 1, 'k5': 5}
  1
  2
  3
  5
  Process finished with exit code 0
  有序字典方法,默认继承无序字典方法,如下:
  def clear(self): #  默认清除所有元素
  >>> c2
  OrderedDict([(0, 2), (1, 2), (2, 2)])
  >>> c2.clear()
  >>> c2
  OrderedDict()
  def copy(self): #  浅copy
  >>> c2 = c1.copy()
  >>> c2
  OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1))
  def fromkeys(cls, S, v=None): # (参见字典类)
  >>> c2=c1.fromkeys((i for i in range(3)),2)
  >>> c2
  OrderedDict([(0, 2), (1, 2), (2, 2)])
  def items(self, *args, **kwargs): #  有序字典同样具有字典的方法
  >>> c1
  OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
  >>> c1.items()
  odict_items([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
  def keys(self, *args, **kwargs): # 有序字典中所有元素的key值
  >>> c1
  OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
  >>> c1.keys()
  odict_keys(['k4', 'k2', 'k3', 'k5'])
  def move_to_end(self, *args, **kwargs): # 将某一元素移到最后
  >>> c1
  OrderedDict([('k4', 1), ('k5', 1), ('k2', 1), ('k3', 1)])
  >>> c1.move_to_end('k5')
  >>> c1
  OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
  def pop(self, k, d=None): #   删除某一元素,需要添加key值(见popitem)
  def popitem(self): #  删除元素,默认从最后删除无序添加key值
  >>> c1
  OrderedDict([('k4', 1), ('k5', 1), ('k2', 1), ('k3', 1), ('k1', 1)])
  >>> c1.popitem()
  ('k1', 1)
  >>> c1.pop()
  Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  TypeError: Required argument 'key' (pos 1) not found
  def setdefault(self, k, d=None): # 添加元素设置默认值,默认第二个参数为None
  >>> c1.setdefault(2,'v2')
  'v2'
  >>> c1
  OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1), (2, 'v2')])
  def update(self, *args, **kwargs): # 更新有序字典
  >>> c1
  OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
  >>> c2
  OrderedDict([(0, 2), (1, 2), (2, 2)])
  >>> c1.update(c2)
  >>> c1
  OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1), (0, 2),
  (1, 2), (2, 2)])
  def values(self, *args, **kwargs): # 有序字典中所有元素的values值
  >>> c1
  OrderedDict([('k4', 1), ('k2', 1), ('k3', 1), ('k5', 1)])
  >>> c1.values()
  odict_values([1, 1, 1, 1])
  class deque(object):  # 双向队列
  def append(self, *args, **kwargs): # 右侧添加
  >>> d2
  deque([ '>', '-', '-', '-', '<'])
  >>> d2.append('-')
  deque([ '>', '-', '-', '-', '<','-'])
  def appendleft(self, *args, **kwargs): # 左侧添加
  >>> d2
  deque([ '>', '-', '-', '-', '<'])
  >>> d2.appendleft('-')
  deque([ '-','>', '-', '-', '-', '<'])
  def clear(self, *args, **kwargs): # 清除所有元素
  def copy(self, *args, **kwargs): #   浅层copy
  >>> d2
  deque([ '>', '-', '-', '-', '<'])
  >>> d3=d2.copy()
  def count(self, value): #
  >>> d2
  deque([ '>', '-', '-', '-', '<'])
  >>> d2.count('-')
  3
  def extend(self, *args, **kwargs): # 右侧扩展
  >>> d3
  deque(['1', '2', '3'])
  >>> d2
  deque([ '>', '-', '-', '-', '<'])
  >>> d2.extendleft(d3)
  >>> d2
  deque([ '>', '-', '-', '-','<','1', '2', '3'])
  def extendleft(self, *args, **kwargs): # 左侧扩展
  >>> d3
  deque(['1', '2', '3'])
  >>> d2
  deque([ '>', '-', '-', '-', '<'])
  >>> d2.extendleft(d3)
  >>> d2
  deque(['3','2', '1', '>', '-', '-', '-','<'])
  def index(self, value, start=None, stop=None): # 索引
  >>> d2
  deque(['3', ',', '2', ',', '1', '--', '>', '-', '-', '-', '-','<'])
  >>> d2.index('2')
  2
  def insert(self, index, p_object): # 可在指定位置插入
  >>> d3
  deque(['1', '2', '3'])
  >>> d3.insert(1,'4')
  >>> d3
  deque(['1', '4', '2', '3'])
  def pop(self, *args, **kwargs): #  右侧删除
  >>> d3
  deque(['1', '4', '2', '3'])
  >>> d3.pop()
  '3'
  def popleft(self, *args, **kwargs): # 左侧删除
  >>> d3.popleft()
  '1'
  >>> d3
  deque(['4', '2'])
  def remove(self, value): #  删除某一元素,需要加参数
  >>> d3.remove('4')
  >>> d3
  deque(['2'])
  def reverse(self): #  反转
  >>> d3
  deque(['1', '2', '3'])
  >>> d3.reverse()
  >>> d3
  deque(['3', '2', '1'])
  def rotate(self, *args, **kwargs): #  下面这个是一个有趣的例子,主要使用了
  deque的rotate方法来实现了一个无限循环的加载动画
  import sys
  import  time
  from collections import deque
  de = deque('>------------<')
  while True:
  print('\r %s ' % (''.join(de)))
  de.rotate(1)
  sys.stdout.flush()
  time.sleep(1)
  结果如下:
  >------------<
  <>------------
  -<>-----------
  --<>----------
  ---<>---------

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-550609-1-1.html 上篇帖子: OpenERP与Python 元编程 下篇帖子: python 数据结构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表