Python 標準ライブラリ array 型制限のある配列
Publish date: 2021-03-29
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'