• Python——数据结构和算法


    1. 解压变量

    1. 最简单的变量解压

    data = [ 'ACME', 50, 91.1, (2012, 12, 21) ]
    name, _, price, date = data

    2. 需要一个变量接收多个值

    s = [1,2,3,4,5]
    a, *b, c = s
    >>> a为1; b为[2,3,4]; c为5.

    3. 存在嵌套的情况

    record = ('ACME', 50, 123.45, (12, 18, 2012))
    name, *_, (*_, year) = record

    2. 优先队列与Top-K

    1. FIFO队列

    使用deque实现长度为n的FIFO队列。 deque(maxlen=N) 会创建一个大小为N的FIFO队列。

    deque有如下函数: append、appendleft、pop、popleft。

    from collections import deque
    
    def search(lines, pattern, history=5):
        previous_lines = deque(maxlen=history)
        for line in lines:
            if pattern in line:
                yield line, previous_lines
            previous_lines.append(line)

     这里使用生成器函数可使搜索过程代码和使用搜索结果代码解耦。

    2. TOP-K

    1. top-1

    通常采用min、max函数求得最大/小值。

    2. top-k

    通常采用nlargest、nsmallest函数

    portfolio = [
        {'name': 'IBM', 'shares': 100, 'price': 91.1},
        {'name': 'AAPL', 'shares': 50, 'price': 543.22},
        {'name': 'FB', 'shares': 200, 'price': 21.09},
        {'name': 'HPQ', 'shares': 35, 'price': 31.75},
        {'name': 'YHOO', 'shares': 45, 'price': 16.35},
        {'name': 'ACME', 'shares': 75, 'price': 115.65}
    ]
    cheap = heapq.nsmallest(3, portfolio, key=lambda s: s['price'])
    expensive = heapq.nlargest(3, portfolio, key=lambda s: s['price'])

     3. 堆数组

    nums = [1, 8, 2, 23, 7, -4, 18, 23, 42, 37, 2]
    import heapq
    heap = list(nums)
    heapq.heapify(heap)
    heap
    >>> [-4, 2, 1, 23, 7, 2, 18, 23, 42, 37, 8]
    # 弹出与插入元素
    heapq.heappop(heap)
    heapq.headpush(heap, 1)

     4. 优先队列

    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]

      -priority 使元素优先级从高到低排列, index 保障了优先级相同的元素按照插入先后顺序排列。

    3. 字典

    1. multidict

    from collections import defaultdict
    
    d = defaultdict(list)
    d['a'].append(1)
    d['a'].append(2)
    d['b'].append(4)
    
    d = defaultdict(set)
    d['a'].add(1)
    d['a'].add(2)
    d['b'].add(4)
    
    type(d)
    >>> collections.defaultdict

    其会自动为将要访问的键(即使字典中并不存在这样的键)创建映射实体。如果不需要这种操作,考虑如下方法。

    d = {} # 一个普通的字典
    d.setdefault('a', []).append(1)
    d.setdefault('a', []).append(2)
    d.setdefault('b', []).append(4)

     2. TreeMap

    from collections import OrderedDict
    
    d = OrderedDict()
    d['foo'] = 1
    d['bar'] = 2

         OrderedDict 内部有着一个用于维护键插入顺序排序的双向链表。所以,相对Dict,OrderedDict需要两倍的储存空间。

    3. Dict的运算

    1. 需要根据取最大值与最小值
    prices = {
        'ACME': 45.23,
        'AAPL': 612.78,
        'IBM': 205.55,
        'HPQ': 37.20,
        'FB': 10.75
    }
    
    min_price = min(zip(prices.values(), prices.keys()))
    >>> (10.75, 'FB')
    max_price = max(zip(prices.values(), prices.keys()))
    >>> (612.78, 'AAPL')
    prices_sorted = sorted(zip(prices.values(), prices.keys()))
    >>> [(10.75, 'FB'), (37.2, 'HPQ'), (45.23, 'ACME'), (205.55, 'IBM'), (612.78, 'AAPL')]

     其中zip函数的用法为

    a = [1, 2, 3]
    b = [4, 5, 6]
    c = [7, 8, 9]
    zip(a, b, c)
    >>> [(1, 4, 7), (2, 5, 8), (3, 6, 9)]

     需要注意的是,zip是一个迭代器,所以不能反复使用。

    2. 差、并、交集

    可使用 items   keys   values 等函数后,获取到相应集合,利用集合运算函数进行运算。

    4. 集合

    1. 元素去重

    a = [1,2,1]
    set(a)

     该方法只可用于可hash对象,否则应自行构建hash函数。

  • 相关阅读:
    MVC 传值
    LINQ to SQL 语句(2)之 Select/Distinct
    LINQ to SQL 语句(1)之 Where
    输入变量相同情况下,结果不正确
    vmware ubuntu 切换终端命令行
    汉字编码问题
    Windows API所提供的功能可以归为七类
    比较好的c++博文
    环境和库的引入
    C#调用Fortran生成的DLL的方法报内存不足
  • 原文地址:https://www.cnblogs.com/tomoka/p/10809355.html
Copyright © 2020-2023  润新知