숫자(실수)를 정말 많이 저장할 때는 리스트보다 오히려 배열이 더 유리하다.

배열은 시퀀스(https://shechren.github.io/lunetzsche/posts/Sequence/를 참조하라)의 한 종류로서 가변형이며, 파일을 읽어오거나 저장하는 메소드 또한 지원한다.

이제 우리는 무작위 배열 하나를 만들어보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
from array import array

from random import random

f = array("d", (random() for \_ in range(10\*\*5)))

# 10의 5제곱에 해당하는 랜덤 배열을 생성한다.

g = f[-1]

# 배열 f의 마지막 수를 출력한다.

print(g)

이제 우리는 10의 5제곱 내에서 랜덤으로 생성된 임의의 수 하나를 얻을 수 있게 된다.

중요한 것은 array 다음에 오는 것은 바로 타입코드라는 것이다. 저기에 임의의 char를 입력해보면 무엇이 문제인지 에러가 뜨니 쉽게 알 수 있다. 우리는 배밀도 실수의 타입코드 d를 이용해서 배열을 생성했다. 리스트 컴프리헨션에서 본 제너레이터 표현식을 사용했으며, 당연히 언더바 대신 i가 들어가든 a가 들어가든 아무 상관 없다.

자 이제 이것을 이진 파일로 저장하고, 읽어와보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
ff = open("ff.bin", "wb")
# ff.bin을 연다. 없다면 생성한다.
f.tofile(ff)
# 파일을 저장한다.
ff.close()
f2 = array("d")
ff = open("ff.bin", "rb")
#ff.bin을 연다.
f2.fromfile(ff, 10\*\*5)
#10의 5제곱에 해당하는 데이터를 추출한다.
ff.close()
gg = f2[-1]
# gg는 f2의 마지막 숫자, 즉 배열 내의 랜덤한 수 하나다.
print(gg)

여기서도 역시나 메소드가 나오게 된다. 전부 적지는 않을 것이며 더 깊게 알고 싶다면 전문가를 위한 파이썬 책을 보자.

메소드설명리스트배열
a.__add__(b)a와 b 리스트를 연결한다.
a + b
가능가능
a.__iadd__(b)a와 b 리스트를 연결하고 a에 저장한다.
a += b
가능가능
a.append(e)제일 뒤에 요소를 하나 추가한다.가능가능
a.clear()모든 항목을 삭제한다.가능불가능
a.__contains__(e)e in s가능가능
a.count(e)e가 발생한 횟수를 계산한다.가능불가능
a.__delitem__(p)p 위치의 요소를 삭제한다.가능가능
a.fromfile(f, n)이진 파일 f에서 n개의 항목을 가져와서 추가한다.불가능가능
a.fromlist(l)리스트 l의 요소를 추가한다. 만약 TypeError가 단 한 번이라도 발생한다면
아무것도 추가하지 않는다.
불가능가능
a.__getitem__(p)p 위치의 항목을 가져온다.
a[p]
가능가능
a.insert(p, e)p 위치에 있는 항목 앞에 e 요소를 추가한다.가능가능
a.__len__()항목 수를 반환한다.
len(a)
가능가능
a.pop([p])p 위치 혹은 제일 마지막 항목을 제거하고 반환한다.가능가능
a.remove(e)값이 e와 일치하는 항목을 제거한다.가능가능
a.tofile(f)이진 파일 f에 항목을 저장한다.불가능가능
a.tolist()항목을 수치형 객체로 변환해서 넣은 리스트를 반환한다.불가능가능