zoukankan      html  css  js  c++  java
  • collections --- python 数据结构

    介绍几种常用的python collections模块的数据结构:namedtuple,OrderedDict,defaultdict,deque,Counter,ChainMap

    namedtuple

    collections.namedtuple(typename, field_names[, verbose=False][, rename=False])
    tuple -- immuteble, iterable, unpackage, 性能优化,线程安全,可hash ,拆包
    对应C语言 tuple == struct list == array
    更好查,可改变, 可读性好

    from collections import namedtuple
    User = namedtuple('User', ["name","age","one", "two", "three"])
    # user_t = ('Tom', 10)
    user_t = {'loantype': 'P', 'secuamt': 'PERSONAL LOANS', 'advdate': '56040.88', 'reported': '20180327', 'inquiry_time': '1544859181849L'}.values()
    user = User(*user_t)
    # user = User(name="Tom", age=10)
    # user = User("Tom", 10)
    print(user)
    # city = namedtuple('City', 'name country population coordinates')
    # tokyo = city('Tokyo','jp',36.999,(35.3434,111.1212))
    # City(name='Tokyo', country='jp', population=36.999, coordinates=(35.3434, 111.1212))
    # 取值
    tokyo.name
    tokyo.country
    tokyo[0]
    

    输出结果

    定义namedtuple也可以是字符串
    The field_names are a sequence of strings such as ['x', 'y']. Alternatively, field_names can be a single string with each fieldname separated by whitespace and/or commas, for example 'x y' or 'x, y'

    User = namedtuple('user_info', "first_name middle_name last_name birth_date")
    user_t = {'loantype': 'P', 'secuamt': 'PERSONAL LOANS', 'advdate': '56040.88', 'reported': '20180327', 'inquiry_time': '1544859181849L'}
    
    first_name = user_t.get('loantype')
    middle_name = user_t.get('advdate')
    last_name = user_t.get('secuamt')
    birth_date = user_t.get('inquiry_time')
    
    user = User(first_name, middle_name, last_name, birth_date)
    user
    # 使用
    user.last_name
    # 'PERSONAL LOANS'
    

    out

    增加一列

    User = namedtuple('User', ["name","age", "gender"])
    user=User(*user_t, "Man")
    print(user)
    


    两个主要方法 _make , _asdict

    # somenamedtuple._make(iterable),Class method that makes a new instance from an existing sequence or iterable
    user_ = ["tom", 13, 342]
    
    user = User._make(user_)
    print(user)
    
    # _asdict方法,把namedtuple 转为 dict(OrderedDict)
    user_info_dict = user._asdict()
    print(user_info_dict)
    

    namedtuple继承了tuple,可拆包
    name, age,*age= user

    OrderedDict

    • Ordered dictionaries are just like regular dictionaries but they remember the order that items were inserted.
      When iterating over an ordered dictionary, the items are returned in the order their keys were first added.
      -->by org
      有序字典主要体现在创建的顺序可以决定取出的顺序
      python2 创建dict是无序的,python3是有序的,
      方法
      popitem() return key,value 单独pop 需要传key值
      move_to_end(key)
    import collections
    
    uid_dict = collections.OrderedDict()
    one = {"uid":2323}
    uid_dict[one['uid']] = one
    # print uid_dict.items()  # OrderedDict([(2323, {'uid': 2323})])
    # print uid_dict.values()[0]  # [(2323, {'uid': 2323})]
    uid_dict.values()
    

    >>> # regular unsorted dictionary
    >>> d = {'banana': 3, 'apple': 4, 'pear': 1, 'orange': 2}
    
    >>> # dictionary sorted by key
    >>> OrderedDict(sorted(d.items(), key=lambda t: t[0]))
    OrderedDict([('apple', 4), ('banana', 3), ('orange', 2), ('pear', 1)])
    
    >>> # dictionary sorted by value
    >>> OrderedDict(sorted(d.items(), key=lambda t: t[1]))
    OrderedDict([('pear', 1), ('orange', 2), ('banana', 3), ('apple', 4)])
    
    >>> # dictionary sorted by length of the key string
    >>> OrderedDict(sorted(d.items(), key=lambda t: len(t[0])))
    OrderedDict([('pear', 1), ('apple', 4), ('orange', 2), ('banana', 3)])
    

    defaultdict

    users = ['a','b','c','a']
    for i in users:
        user = user_dict.setdefault(i,0)
        user[i] += 1
    # 统计个数
    
    default_dict = defaultdict(dict)  # 参数可迭代的对象 int, set
    
    # default_dict = defaultdict(gen_default)  # 默认字典套字典 __missing__ 方法
    
    default_dict['cat']  # key不存在,会自动生成一个key
    # 上面代码就变成
    users = ['a','b','c','a']
    for i in users:
        default_dict[i] += 1
    

    deque

    from collections import deque
    iter_obj = [],(),{}
    user_deque = deque(iter_obj)
    

    Counter

    from collections import Counter
    _counter = Counter("afhsahfjajsfe")
    _counter2 = Counter("hslda")
    _counter.update(_counter2)
    print(_counter)
    print(_counter.most_common(2))  # heapq 堆的数据结构
    

    Counter

    ChainMap

    # 访问多个字典如同一个
    from collections import ChainMap
    dict1 = {'a':1,"b":2}
    dict2 = {'c':3}
    new_dict = ChainMap(dict1, dict2)
    new_dict
    

    for key, value in new_dict.items():
        print(key)
    

    # 对元数据的修改
    new_dict.maps[0]['a'] = 'hello'
    for key, value in new_dict.items():
        print(key, value)
    

  • 相关阅读:
    ORACLE触发器具体解释
    秒杀多线程第四篇 一个经典的多线程同步问题
    Java中Integer类的方法
    九大排序算法再总结
    删除条目时的确认对话框
    VirtualBox安装及使用说明和虚拟机安装XP系统图文教程
    J2EE之验证码实现
    教你用笔记本破解无线路由器password
    vSphere HA状况:未知配置错误解决的方法
    HDU 2504 又见GCD
  • 原文地址:https://www.cnblogs.com/bruspawn/p/10213553.html
Copyright © 2011-2022 走看看