• 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)
    

  • 相关阅读:
    99%的人都理解错了HTTP中GET与POST的区别
    CSS3 Border-image
    Tween.js的使用示例
    HTML5的postMessage使用记要
    Vuejs——(2)Vue生命周期,数据,手动挂载,指令,过滤器
    nodejs ejs 请求路径和静态资源文件路径
    JS逗号运算符的用法详解
    toStirng()与Object.prototype.toString.call()方法浅谈
    正则表达式之 贪婪与非贪婪模式
    利用符号进行的类型转换,转换成数字类型 ~~
  • 原文地址:https://www.cnblogs.com/bruspawn/p/10213553.html
Copyright © 2020-2023  润新知