python学習ノートシーケンス

4309 ワード

組み込みシーケンス
  • 容器シーケンス
  • list, tuple, collections.dequeなどのシーケンスは異なるタイプのデータを格納できます
  • フラットシーケンス
  • str, byte, bytearray, memoryview, array.array、これらのシーケンスには1つのタイプのデータしか収容できません.
    以上、コンテナシーケンスは、任意のタイプのオブジェクトを含む参照を格納し、フラットシーケンスは参照ではなく値を格納します.
    リスト(list)は最も基本的で最も重要なシーケンスタイプです.
    リストの導出
    >>> symbols = '       '
    >>> codes = [ord(symbol) for symbol in symbols]
    >>> codes
    [20013, 21326, 20154, 27665, 20849, 21644, 22269]

    リストはforループ変換によって導出され,可読性が向上するとともにコードがより簡潔になる
    pythonは、コード内の[]/()/{}内の改行を無視します.ここでは、継続文字""を省略できます.
    ジェネレータ式
    ジェネレータの構文とリストの導出の差は多くなく、角カッコを丸カッコに変えるだけです.
    >>> symbols = '       '
    >>> tuple(ord(symbol) for symbol in symbols)
    (20013, 21326, 20154, 27665, 20849, 21644, 22269)
    >>> import array
    >>> array.array('I', (ord(symbol) for symbol in symbols))
    array('I', [20013, 21326, 20154, 27665, 20849, 21644, 22269])

    (1)ジェネレータ式が関数固有のパラメータである場合、このパラメータは余分なカッコ(2)arrayの構造方法で2つのパラメータを必要としないため、ジェネレータ式はカッコで囲まれる必要がある
    list.sortメソッドと内蔵関数sorted
  • list.sortメソッドの機能は、シーケンスをその場でソートすることです.すなわち、配列を再作成することなく、元の配列を
  • にコピーします.
  • とlist.sortとは異なり、シーケンスの内蔵関数sortedの機能もソートされますが、元の配列に変更はありません.
  • >>> fruits = ['grape', 'respberry', 'apple', 'banana']
    >>> sorted(fruits)
    ['apple', 'banana', 'grape', 'respberry']
    >>> fruits
    ['grape', 'respberry', 'apple', 'banana']
    >>> sorted(fruits, key=len)
    ['grape', 'apple', 'banana', 'respberry']
    >>> sorted(fruits, key=len, reverse=True)
    ['respberry', 'banana', 'grape', 'apple']
    >>> fruits
    ['grape', 'respberry', 'apple', 'banana']
    >>> fruits.sort()
    >>> fruits
    ['apple', 'banana', 'grape', 'respberry']

    以上の例から両者の差が分かるが,sorted関数はkey,reverseの2つのパラメータを受け入れ,パラメータkeyは比較の基準を表し,reverseは逆シーケンスを表すかどうか(True)を表す.
    bisectによる秩序化シーケンスの管理
    bisectによる検索
    関数bisect(haystack,needle)は、haystack(干し草の山、秩序あるシーケンス)の中でneedle(針)の位置を見つけることができ、この位置が満たす条件は、needleを関数が検索した位置に挿入した後もhaystack全体が秩序を保つことである.
    import bisect
    import sys
    import random
    
    
    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_right
    
        print('Demo: ', bisect_fn.__name__)
        print('haystack ->', ''.join('%2d' % n for n in haystack))
        demo(bisect_fn)
    
    
    
        print("

    #################insort###############") size = 7 # random.seed(1729) my_list = [] for i in range(7): new_item = random.randrange(size * 2) bisect.insort(my_list, new_item) print('%2d ->' % new_item, my_list) ############# ################ Demo: bisect_right haystack -> 1 4 5 6 8121520212323262930 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 #################insort############### 9 -> [9] 7 -> [7, 9] 1 -> [1, 7, 9] 4 -> [1, 4, 7, 9] 5 -> [1, 4, 5, 7, 9] 12 -> [1, 4, 5, 7, 9, 12] 5 -> [1, 4, 5, 5, 7, 9, 12]

    *bisectは実はbisect_rihght関数の略で、元のシーケンスが挿入された要素と等しい要素の位置の右側を返します.この関数には姉妹関数bisect_があります.left、元のシーケンスが挿入された要素と等しい要素の位置の左側を返す挿入位置
    本には、pythonの動作原理を可視化分析するツールであるPython Tutorのウェブサイトも推奨されています.
    注:以上の内容の主体はすべて《流暢なpython》の本の中の第2章のシーケンスの構成の配列から来ます