• An Array of Sequences(2)


    1. Managing Ordered Sequences with bisect

    The bisect module offers two main functions --- bisect and insort --- that use the binary serach algorithm to quickly find and insert items in any sorted sequence.

    Example 2-17. bisect finds insertion points for items in a sorted sequence.

    import bisect
    import sys
    
    HAYSTACK = [1, 4, 5, 6, 8, 12, 15, 20, 21, 23, 23, 26, 29, 30]
    NEEDLES = [0, 1, 2, 5, 8, 10, 22, 23, 29, 30, 31]
    
    ROW_FMT = '{0:2d} @ {1:2d}    {2}{0:<2d}'
    
    
    def demo(bisect_fn):
        for needle in reversed(NEEDLES):
            position = bisect_fn(HAYSTACK, needle)
            offset = position * '  |'
            print(ROW_FMT.format(needle, position, offset))
    
    
    if __name__ == "__main__":
    
        if sys.argv[-1] == "left":
            bisect_fn = bisect.bisect_left
        else:
            bisect_fn = bisect.bisect
    
    print('DEMO:', bisect_fn.__name__)
    print('haystack ->', ' '.join("%2d" % n for n in HAYSTACK))     # 注意此处 join 的用法: join 中没有用列表[] 符号
    demo(bisect_fn)
    
    
    """
    # 输出: 脚本不加参数
    NEO:ch2-array-of-sequences zhenxink$ python3 search_with_bisect.py 
    DEMO: bisect
    haystack ->  1  4  5  6  8 12 15 20 21 23 23 26 29 30
    31 @ 14      |  |  |  |  |  |  |  |  |  |  |  |  |  |31
    30 @ 14      |  |  |  |  |  |  |  |  |  |  |  |  |  |30
    29 @ 13      |  |  |  |  |  |  |  |  |  |  |  |  |29
    23 @ 11      |  |  |  |  |  |  |  |  |  |  |23
    22 @  9      |  |  |  |  |  |  |  |  |22
    10 @  5      |  |  |  |  |10
     8 @  5      |  |  |  |  |8 
     5 @  3      |  |  |5 
     2 @  1      |2 
     1 @  1      |1 
     0 @  0    0 
     
    # 输出: 脚本加参数 left
    NEO:ch2-array-of-sequences zhenxink$ python3 search_with_bisect.py left
    DEMO: bisect_left
    haystack ->  1  4  5  6  8 12 15 20 21 23 23 26 29 30
    31 @ 14      |  |  |  |  |  |  |  |  |  |  |  |  |  |31
    30 @ 13      |  |  |  |  |  |  |  |  |  |  |  |  |30
    29 @ 12      |  |  |  |  |  |  |  |  |  |  |  |29
    23 @  9      |  |  |  |  |  |  |  |  |23
    22 @  9      |  |  |  |  |  |  |  |  |22
    10 @  5      |  |  |  |  |10
     8 @  4      |  |  |  |8 
     5 @  2      |  |5 
     2 @  1      |2 
     1 @  0    1 
     0 @  0    0 
    """

    Example 2-18: Given a test score, grades returns the corresponding letter grade. (bisect 的一个应用例子)

    import bisect
    
    
    def grade(score, breakpoints=[60, 70, 80, 90], grades='FDCBA'):
        i = bisect.bisect(breakpoints, score)
        return grades[i]
    
    
    letter_grade = [grade(score) for score in [33, 99, 77, 70, 89, 90, 100]]
    
    print(letter_grade)
    
    # 输出:
    # ['F', 'A', 'C', 'C', 'B', 'A', 'A']

    insort(seq, item) inserts items into seq so as to keep seq in ascending order.

    Example 2-19: Insort keeps a sorted sequence always sorted.

    import bisect
    import random
    
    SIZE = 7
    random.seed(1729)
    
    my_list = []
    for i in range(SIZE):
        new_item = random.randrange(SIZE * 2)
        bisect.insort(my_list, new_item)
        print("%2d ->" % new_item, my_list)
    
    '''
    # 输出:
    10 -> [10]
     0 -> [0, 10]
     6 -> [0, 6, 10]
     8 -> [0, 6, 8, 10]
     7 -> [0, 6, 7, 8, 10]
     2 -> [0, 2, 6, 7, 8, 10]
    10 -> [0, 2, 6, 7, 8, 10, 10]
    '''
    
    # bisect.insort keeps a sorted sequence always sorted.

    bisect 模块参数链接:https://www.cnblogs.com/skydesign/archive/2011/09/02/2163592.html 

    2. Array

    If the list will only contain numbers, an array.array is more efficient than a list : array supports all mutable sequence operations(including .pop, .insert, and .extend), and additional methods for fast loading and saving such as .frombytes and .tofile .

    Example 2-20. Creating , saving, and loading a large array of floats.

    from array import array
    from random import random
    
    floats = array('d', (random() for i in range(10 ** 7)))
    # create an array of double-precision floats(typecode 'd') from any iterable
    # object -- in this case, a generator expression.
    
    print(floats[-1])
    
    with open("floats.bin", "wb") as fp:
        floats.tofile(fp)
    
    floats2 = array('d')  # create an empty array of doubles.
    
    with open("floats.bin", "rb") as fp:
        floats2.fromfile(fp, 10 ** 7)
    # array.fromfile(f, n)  --->  Read n objects from the file object f and append them to the end of the array.
    
    print(floats2[-1])
    print(floats == floats2)
    
    
    """
    输出结果:
    0.31630082281843985
    0.31630082281843985
    True
    """

    array 用法链接: https://blog.csdn.net/xc_zhou/article/details/88538793 

    end

  • 相关阅读:
    idea快捷键操作
    2018/2/17 SpringCloud的一个简单小介绍
    2018/2/16 解析Logback的AppenderBase源码,并举一反三的实现Logback扩展功能的思路,以及它的实际业务应用场景
    2018/2/15 ES Beats的学习笔记
    2018/2/14 x-pack的学习
    2018/2/14 自己实现ArrayList,LinkedList和Iterator,以及在此过程中对于面向对象,面向接口,还有抽象类的一些思考感悟
    2018/2/13 ElasticSearch学习笔记三 自动映射以及创建自动映射模版,ElasticSearch聚合查询
    2018/2/11 ELK技术栈之ElasticSearch学习笔记二
    2018/2/5 ELK技术栈之ElasticSearch学习笔记
    2018/1/28 RocketMq学习笔记
  • 原文地址:https://www.cnblogs.com/neozheng/p/12151052.html
Copyright © 2020-2023  润新知