介绍几种常用的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'
增加一列
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 堆的数据结构
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)