python高级编程改造_Python高级编程-collections模块(番外篇)

Python高级编程-collections模块(番外篇)

x.1 collections模块介绍

from collections import *

from collections.abc import *

"""

提供了更加高级的数据结构

"""

x.2 tuple的功能

不可变,iterable

拆包 # name, *others = ("coder", 20, 175)

tuple不可变性不是绝对的 # ("name", [20, 175])

tuple比list好的地方

immutable的重要性:

​性能优化:指出元素全部为immutable的tuple会作为常量在编译时确定,因此产生了如此显著的速度差异

​线程安全

​可以作为dict的key

​拆包特性

如果要拿C语言来类比,Tuple对应的是struct,而List对应的是array

x.3 nametuple 详解

from collections import nametuple

User = nametuple("User", ["name", "age", "height"])

user = User(name="booby", age=29, height=175)

print(user.age, user.name, user.height)

"""

为什么不用类封装,而用nametuple?

因为使用nametuple会比class少去很多默认属性,更加节约空间。

"""

user_tuple = ("bobby", 29, 175)

user = User(*user_tuple) # User._make(user_tuple)

print(user._asdict())

name, age, height = user

x.4 defaultdict 功能详解

from collections import defaultdict

# 统计数量

user_dict = {}

users = ["bobby1", "bobby2", "bobby3", "bobby1", "bobby2", "bobby2"]

for user in users:

if user not in user_dict:

user_dict[user] = 1

else:

user_dict[user] += 1

print(user_dict)

# 实际上dict中有一个方法setdefault

user_dict = {}

users = ["bobby1", "bobby2", "bobby3", "bobby1", "bobby2", "bobby2"]

for user in users:

user_dict.setdefault(user, 0) # 如果键不存在,就会设置默认值,性能更高,少了一次查

user_dict[user] += 1

print(user_dict)

# 代码可否再简洁,使用defaultdict

default_dict = defaultdict(int) # 传入一个可调用对象

users = ["bobby1", "bobby2", "bobby3", "bobby1", "bobby2", "bobby2"]

for user in users:

default_dict[user] += 1

print(default_dict)

"""

defaultdict如何实现?

使用__missing__魔法函数

"""

x.5 deque 功能详解

"""

双端队列

线程安全,list不是线程安全

"""

from collections import deque

# 只能队列尾部操作

user_list = ["bobby", "bobby1"]

user_name = user_list.pop()

print(user_name, user_list)

# 使用双端队列

user_list = deque(("bobby1", "bobb2"))

user_list_dict = deque(

{

"bobby1": 1,

"bobby2": 2

}

)

print(user_list)

print(user_list_dict)

user_list.appendleft("bobby8")

user_list_copy = user_list.copy() # 浅拷贝只是拷贝元素,可变元素会直接指向

print(id(user_list), id(user_list_copy))

class deque(MutableSequence[_T], Generic[_T]):

@property

def maxlen(self) -> Optional[int]: ...

def __init__(self, iterable: Iterable[_T] = ...,

maxlen: int = ...) -> None: ...

def append(self, x: _T) -> None: ...

def appendleft(self, x: _T) -> None: ...

def clear(self) -> None: ...

if sys.version_info >= (3, 5):

def copy(self) -> deque[_T]: ...

def count(self, x: _T) -> int: ...

def extend(self, iterable: Iterable[_T]) -> None: ...

def extendleft(self, iterable: Iterable[_T]) -> None: ...

def insert(self, i: int, x: _T) -> None: ...

def index(self, x: _T, start: int = ..., stop: int = ...) -> int: ...

def pop(self, i: int = ...) -> _T: ...

def popleft(self) -> _T: ...

def remove(self, value: _T) -> None: ...

def reverse(self) -> None: ...

def rotate(self, n: int) -> None: ...

x.6 Counter功能详解

"""

用来做统计

"""

from collections import Counter

users = ["bobby1", "bobby2", "bobby3", "bobby1", "bobby2", "bobby2"]

user_counter = Counter(users)

counter_str = Counter("dffdfdfd")

counter_str2 = Counter("dfdfdfdf")

user_counter.update("gwdesd")

user_counter.update(counter_str2) # 任意可迭代对象

print(counter_str)

print(user_counter)

# top n问题 headq 堆数据结构

print(user_counter.most_common(2)) # 返回前两名统计结果

x.7 OrderedDict 功能详解

"""

有序字典

"""

from collections import OrderedDict

user_dict = dict() # Python3中字典默认有序的,Python2是无需的

user_dict["b"] = "bobby2"

user_dict["a"] = "bobby1"

user_dict["c"] = "bobby3"

print(user_dict)

user_dict = OrderedDict()

user_dict["b"] = "bobby2"

user_dict["a"] = "bobby1"

user_dict["c"] = "bobby3"

print(user_dict)

print(user_dict.pop("a")) # pop方法必须传一个key

print(user_dict.popitem()) # 返回一个元组(key, val)

print(user_dict.move_to_end("b"))

x.8 ChainMap 功能

"""

用于连接dict

"""

from collections import ChainMap

user_dict1 = {"a":"bobby1", "b":"bobby2"}

user_dict2 = {"c":"bobby2", "d":"bobby3"}

for key,value in user_dict1.items():

print(key, value)

for key, value in user_dict2.items():

print(key, value)

new_dict = ChainMap(user_dict1, user_dict2)

new_dict.new_child({"aa":"aa", "bb":"bb"}) # 动态添加

print(new_dict["c"])

print(new_dict.maps)

new_dict.maps[0]["a"] = "bobby" # 只是指向对应字典,并没有完全复制

for key, value in new_dict.items():

print(key, value)

# 有重复怎么办?

user_dict1 = {"a":"bobby1", "b":"bobby2"}

user_dict2 = {"b":"bobby2", "d":"bobby3"}

new_dict = ChainMap(user_dict1, user_dict2) # 只取重复值第一个

for key, value in new_dict.items():

print(key, value)

你可能感兴趣的:(python高级编程改造)