zoukankan      html  css  js  c++  java
  • python实用小技之数据结构


    本文大多数例子搬自 python cookbook 这里是对学习的一个总结和提炼
    ps:python版本为python3

    1.解压序列赋值给多个变量

    # 有一个包含 N 个元素的元组或者是序列,怎样将它里面的值解压后同时赋值给 N 个变量?
    data = ['ACME', 50, 91.1, (2012, 12, 21)]
    # 任何的序列(或者是可迭代对象)可以通过一个简单的赋值语句解压并赋值给多个变量
    # 变量的数量必须跟序列元素的数量是一样的
    name, shares, prices, date = data
    print(name, shares, prices, date, sep=" | ", end="
    ")
    # 如果只需要一部分,可以给个占位变量如
    _, sha, pr, _ = data
    print(sha,pr,sep=' | ')
    
    运行结果:
    ACME | 50 | 91.1 | (2012, 12, 21)
    50 | 91.1
    

    2.解压可迭代对象赋值给多个变量

    # 解压可迭代对象赋值给多个变量
    def drop_frist_last(grades):
        frist, *middle, last = grades
        return sum(middle) / len(middle)
    print(drop_frist_last([0, 60, 70, 80, 100]))
    
    # 有时候,你想解压一些元素后丢弃它们,可以使用 比如 _ 或者 ign
    record = ('ACME', 50, 123.45, (12, 18, 2012))
    name,*_,(*_,year) = record
    print(name,year)
    
    运行结果:
    70.0
    ACME 2012
    

    3.保留有限的历史记录

    '''
    使用 deque(maxlen=N) 构造函数会新建一个固定大小的队列。当新的元素加入并且这个队列已满的时候, 最老的元素会自动被移除掉
    '''
    def search(lines, pattern, histroy=60):
        previous_lines = deque(maxlen=histroy)
        for line in lines:
            if pattern in line:
                yield line, previous_lines
                previous_lines.append(line)
                print(len(previous_lines))
                for item in previous_lines:
                    print(item)
    
    if __name__ == "__main__":
        with open(os.getcwd() + "/Lesson1.py") as f:
            for line, prevlines in search(f, '50', 3):
                print("type prevlines =", type(prevlines))
                for pline in prevlines:
                    print('pline = ', pline, end='')
                print("type line =", type(line))
                # print('line = ', line, end='')
                print('-' * 20)
    #            
    

    4.怎样从一个集合中获得最大或者最小的 N 个元素列表?

    # 当集合是一个列表是
    nums = [3, 10, 5, 23, 7, -4, 18, 23, 42, 37, 2]
    print(heapq.nlargest(3, nums))
    print(heapq.nsmallest(3, nums))
    # 如果是更负责的对象时候
    mydirt = [
        {'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}]
    print(heapq.nlargest(2, mydirt, key=lambda l: l['price']))
    print(heapq.nsmallest(2, mydirt, key=lambda l: l['price']))
    
    运行结果
    [42, 37, 23]
    [-4, 2, 3]
    [{'name': 'AAPL', 'shares': 50, 'price': 543.22}, {'name': 'IBM', 'shares': 100, 'price': 91.1}]
    [{'name': 'FB', 'shares': 200, 'price': 21.09}, {'name': 'HPQ', 'shares': 35, 'price': 31.75}]
    

    ps:堆数据结构最重要的特征是 heap[0] 永远是最小的元素,另外 nlargest,nsmallest 适合查找的元素个数相对比较小的时候,如果你仅仅想查找唯一的最小或最大(N=1)的元素的话,那么使用 min() 和 max() 函数会更快些。 类似的,如果 N 的大小和集合大小接近的时候,通常先排序这个集合然后再使用切片操作会更快点 ( sorted(items)[:N] 或者是 sorted(items)[-N:] )

    5.字典排序

    '''
    你想创建一个字典,并且在迭代或序列化这个字典的时候能够控制元素的顺序。
    '''
    from collections import OrderedDict
    
    d = OrderedDict()
    d['foo'] = 1
    d['beer'] = 2
    d['bar'] = 4
    d['park'] = 3
    for key in d:
        print(key, d[key])
    
    执行结果:
    foo 1
    beer 2
    bar 4
    park 3
    

    6.字典中的键映射多个值

    from collections import defaultdict
    
    df_d = defaultdict(list)
    df_d['a'].append(1)
    df_d['a'].append(2)
    df_d['b'].append(4)
    print(df_d)
    
    d2 = defaultdict(set)
    pairs = [('a', 1), ('a', 2), ('b', 4)]
    for key, value in pairs:
        d2[key].add(value)
    print(d2)
    
    运行结果:
    defaultdict(<class 'list'>, {'a': [1, 2], 'b': [4]})
    defaultdict(<class 'set'>, {'a': {1, 2}, 'b': {4}})
    

    7.字典的运算(求最小值、最大值、排序等)

    怎样在数据字典中执行一些计算操作(比如求最小值、最大值、排序等等)?

    prices = {
        'ACME': 45.23,
        'AAPL': 612.78,
        'IBM': 205.55,
        'HPQ': 37.20,
        'FB': 10.75
    }
    
    # 求最小值
    # 方法 1,通过zip 函数创建的是一个只能访问一次的迭代,将键值反过来
    print(min(zip(prices.values(), prices.keys())))
    # 输出 (10.75, 'FB')
    
    # 方法二 直接取values 获取最小值,不过你就不知道对于的key
    print(min(prices.values()))
    # 输出 10.75
    
    # 方法三
    min_key = min(prices, key=lambda k: prices[k])
    print(prices[min_key])
    # 输出 FB
    
    # 排序
    prices_sorted = sorted(zip(prices.values(), prices.keys()))
    print(prices_sorted)
    # 输出 [(10.75, 'FB'), (37.2, 'HPQ'), (45.23, 'ACME'), (205.55, 'IBM'), (612.78, 'AAPL')]
    
  • 相关阅读:
    Openstack Nova 源码分析 — Create instances (nova-conductor阶段)
    openstack nova 源码解析 — Nova API 执行过程从(novaclient到Action)
    Fiddler抓包9-保存会话(save)
    Fiddler抓包10-会话框添加查看get与post请求类型
    Fiddler抓包11-HTTPS证书Actions无法导出问题
    Fiddler抓包7-post请求(json)
    Fiddler抓包8-打断点(bpu)
    Fiddler抓包3-查看get与post请求
    Fiddler抓包4-工具介绍(request和response)
    Fiddler抓包5-接口测试(Composer)
  • 原文地址:https://www.cnblogs.com/luoman/p/12663873.html
Copyright © 2011-2022 走看看