BLOG

个人博客,记录学习与生活

数据结构和操作的部分库

Published Dec. 4, 2019, 6:17 p.m. by kkk

可迭代对象的拆分(重点:*操作)

string库

有比较方便的方法,要进行一些小测试时很方便(比如结合random库随机产生3位随机字母):

import string
string.ascii_letters
'''abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'''
string.ascii_lowercase
'''abcdefghijklmnopqrstuvwxyz'''
string.ascii_uppercase
'''ABCDEFGHIJKLMNOPQRSTUVWXYZ'''
string.digits
'''0123456789'''
string.hexdigits
'''0123456789abcdefABCDEF'''
string.octdigits
'''01234567'''

deque库

deque为双端队列,创建时指定最大长度,插入数据时可从首插入也可从尾插入,移出数据时亦是如此。当元素已满时,继续插入,会自动将队列中按插入方向相反方向的第一个元素移出

from collections import deque
d = deque(maxlen=5)  # 创建
'''在IPython中通过 dir(deque) 可看到以下方法或属性(只保留了部分方法或属性)'''
append()    # 右端入队
appendleft()    # 左端入队
pop()   # 右端出队
popleft()   # 左端出队
remove()    # 出队第一个与传递参数相同的元素
reverse()   # 逆转元素排列顺序
rotate()    # ‘旋转’,默认步进为1,即将真个队列向后移动一位,最后的元素移至开头
extend()    # 传递可迭代类型,将该可迭代类型元素逐个右端入队
extendleft()    # 同上,只是变成左端入队

heapq库

主要方法如下:

heapify()   # 将数据(通常为列表数据)变为堆
heappop()   # 出堆(最小),和heappush的用法可参照下面PriorityQueue中的用法
heappush()  # 入堆
nlargest()  # 获取n个最大元素
'''用法示范heapq.nlargest(n, list)'''
nsmallest() # 获取n个最小元素
'''用法示范heapq.nsmallest(n, list)'''

经验总结:找出一组元素中比较小的数

  1. 找最小或者最大的一个数。min(),max()
  2. 找最小或者最大的一些数(个数不多)。nsmallest,nlargest()(from heapq);堆算法
  3. 找最小或者最大的一些数(个人接近总体)。sorted(items)[:N],sorted(items)[-N:];排序后切片

PriorityQueue构造(利用heapq)

import heapq
class PriorityQueue:
    def __init__(self):
        self._queue = []
        self._index = 0

    def push(self, item, priority):
        heapq.heappush(self._queue, (-priority, self._index, item))
        self._index += 1

    def pop(self):
        return heapq.heappop(self._queue)[-1]

defaultdict

对于多值映射的实现,通常是将值设为集合或列表元素。具体实现则有两种:

# 通过普通字典
d = {}
# d.setdefault('a', []).append(1)
for key, value in pairs:
    if key not in d:
        d[key].append(value)
# 通过defaultdict
d = defaultdict(list)
# d['a'].append(1)
for key, value in pairs:
    d[key].append(value)

OrderedDict

通过OrderedDict可实现字典的按序存储(但是无法通过索引存取数据),其它与普通字典基本无差异

注:由于要维护另一个链表,OrderedDict的内存大小是普通字典的两倍,需权衡影响

命名切片

python具有内置关键字slice,用于创建切片对象,可在所有使用切片的地方进行替换。可大大提高程序的可读性。用法

items = [0, 1, 2, 3, 4, 5, 6]
a = slice(2, 4)
'''下面两者等价'''
items[2:4]
items[a]

Counter

计数器Counter(from collections)。底层采用字典实现。

num = [1,2,1,4,6,1,5,6,3,2,1,1,4]
c = Counter(num)
c.most_common(n) # n为给定整数,输出频数最高的n个元素,不给参数则整体输出
c.keys()
# dict_keys([1, 2, 4, 6, 5, 3])
c.elements()
# 可迭代对象,迭代输出为1 1 1 1 1 2 2 4 4 6 6 5 3(即按频次排序)
c.values()
# dict_values([5, 2, 2, 2, 1, 1])

itemgetter与attrgetter

简而言之就是获取元素,等价含义如下:

from operator import itemgetter, attrgetter
# 下面两种等价,前者运行速度快一些
itemgetter(f)
lambda u: u[f]
# 下面两种等价,前者运行速度快一些
attrgetter(f)
lambda u: u.f

Share this post
< Pre: 一元线性回归 Pos: 多元线性回归 >
No comments
Similar posts
Add a new comment