2021-04-02に投稿

Python 標準ライブラリ array 型制限のある配列

Pythonのリストやタプルは型の制限なしに宣言できますが、
このarrayモジュールで要素の型を制限した配列を使えるようになります。

arrayの定義

import array

# array(typecode[, initializer]) 
array.array('b') # 符号付きchar
array.array('B') # 符号なしchar
array.array('u') # ユニコード文字
array.array('h') # 符号付きshort
array.array('H') # 符号なしshort
array.array('i') # 符号付きint
array.array('I') # 符号なしint
array.array('l') # 符号付きlong
array.array('L') # 符号なしlong
array.array('q') # 符号付きlong long
array.array('Q') # 符号なしlong long
array.array('f') # 浮動小数点
array.array('d') # 浮動小数点(double)

array.array('b', b'abcde')
array.array('B', b'abcde')
array.array('u', 'abcde あいうえお')
array.array('h', [-32768, -32767, -1, 0, 1, 32767]) # -2**15 ~ 2**15 -1
array.array('H', [0, 1, 65535]) # 0 ~ 2**16 -1
array.array('i', [-2147483648, -1, 0, 1, 2147483647]) # -2**31 ~ 2**31 -1
array.array('I', [0, 1, 4294967295]) # 0 ~ 2**32 -1
array.array('l', [-2147483648, -1, 0, 1, 2147483647]) # -2**31 ~ 2**31 -1
array.array('L', [0, 1, 4294967295]) # 0 ~ 2**32 -1
array.array('q', [-9223372036854775808, -1, 0, 1, 9223372036854775807]) # -2**63 ~ 2**63 -1
array.array('Q', [0, 1, 18446744073709551615]) # 0 ~ 2**64 -1
array.array('f', [-float("inf"), -3.4e+38, -1.0, 0.0, 1.0, 3.4e+38, float("inf")])
array.array('d', [-float("inf"), -1.7e+308, -1.0, 0.0, 1.0, 1.7e+308, float("inf")])

arrayの使い方

# typecode タイプコード
array.array('i').typecode # => 'i'

# itemsize 要素1つのバイト長さ
array.array('i').itemsize # => 4

# append(x) 要素の追加
array_i = array.array('i', [1, 2])
array_i.append(3)
array_i # => array('i', [1, 2, 3])

# buffer_info() アドレスと要素数のタプル
array_i.buffer_info() # => (2686464984304, 3)

# count(x) 要素の出現回数
array_i.count(2) # =>

# extend(iterable) イテレータの要素を追加
array_i.extend(x for x in range(4, 7))
array_i # => array('i', [1, 2, 3, 4, 5, 6])

# frombytes(s) バイト列の追加
array_s = array.array('B', b'abcde')
array_s.frombytes(b"xyz")
array_s # => array('B', [97, 98, 99, 100, 101, 120, 121, 122])

# fromfile(f, n) ファイルからバイト列n個の読み込み
with open('sample.txt', mode='bw') as f:
    f.write(b'123XYZ')
with open('sample.txt', mode='br') as f:
    array_s.fromfile(f, 5)
array_s # => array('B', [97, 98, 99, 100, 101, 120, 121, 122, 49, 50, 51, 88, 89])

# fromlist(list) リスト要素を追加
array_i.fromlist([10, 20, 30])
array_i # => array('i', [1, 2, 3, 4, 5, 6, 10, 20, 30])

# fromunicode(s) 文字列から要素を追加
array_u = array.array('u', 'abcde あいうえお')
array_u.fromunicode('🐍')
array_u # => array('u', 'abcde あいうえお🐍')

# index(x) インデックス
array.array('u', 'abcde').index('c') # => 2

# insert(i, x) 挿入
array_i.insert(3, 90)
array_i # => array('i', [1, 2, 3, 90, 4, 5, 6, 10, 20, 30])

# array.pop([i]) ポップ
pop_item = array_i.pop()
pop_item # => 30
array_i # => array('i', [1, 2, 3, 90, 4, 5, 6, 10, 20])

# array.remove(x) 除去
array_i.remove(90) 
array_i # => array('i', [1, 2, 3, 4, 5, 6, 10, 20])

# array.reverse() 逆順
array_i.reverse()
array_i # => array('i', [20, 10, 6, 5, 4, 3, 2, 1])

# array.tobytes() バイト列変換
array_s.tobytes() # => b'abcdexyz123XY'

# array.tofile(f) バイト列書き込み
with open('sample.txt', mode='bw') as f:
    array_s.tofile(f)
with open('sample.txt', mode='r', encoding='utf-8') as f:
    print(f.read())# => abcdexyz123XY

# array.tolist() リスト変換
array_i.tolist() # => [20, 10, 6, 5, 4, 3, 2, 1]
array_s.tolist() # => [97, 98, 99, 100, 101, 120, 121, 122, 49, 50, 51, 88, 89]
array_u.tolist() # => ['a', 'b', 'c', 'd', 'e', ' ', 'あ', 'い', 'う', 'え', 'お', '\ud83d', '\udc0d']

# array.tounicode() ユニコード文字列変換
array_u.tounicode() # => 'abcde あいうえお🐍'

# array_i.byteswap() バイトスワップ
array_i.byteswap()
array_i # => array('i', [335544320, 167772160, 100663296, 83886080, 67108864, 50331648, 33554432, 16777216])

# typecodes 利用可能なタイプコード
array.typecodes # => 'bBuhHiIlLqQfd'
Originally published at marusankakusikaku.jp
ツイッターでシェア
みんなに共有、忘れないようにメモ

maru3kaku4kaku

Pythonこつこつ学習中。よく忘れる。

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント