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)

posted @ 2019-01-03 16:48  bruspawn  阅读(143)  评论(0编辑  收藏  举报