Pythonのプログラミングをしていると、考えた通りに処理できるかを簡単なサンプルデータでテストしてみたいことがよくあります。
特にリストをループにかける処理はよく用いるので、以下のような単純な整数やアルファベットからなるリストのサンプルがすぐに使えると便利です。
sample1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
sample2 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
sample3 = ['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR', 'STU', 'VWX', 'YZA', 'BCD']
要素の数が少しだからと手入力でつくらずに、コードを使えば要素の数がいくつでも簡単につくれてラクです(数えながら手でつくるのは結構大変です!)。
そこで、今回は「要素が10個のリストのサンプルを手早くつくる方法」をいくつかご紹介します。ぜひ日頃のプログラミングの参考にしてください。
本記事の目次
整数の要素
# 1から10までの整数
>>> list(range(1,11))
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
# 10から1までの整数
>>> list(range(10,0,-1))
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
# 偶数だけ2から10個
>>> list(range(2, 2 * 10 + 1, 2))
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
# 奇数だけ1から10個
>>> list(range(1, 2 * 10, 2))
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
整数を順番通りでなくランダムにするには、Pythonの標準モジュールのrandom を用います。random.sample()
を用いて「1~10の整数(range(1,11)
)」から重複しないように「10回(k=10
)」ランダムにサンプリングします。
# 1から10までの整数をランダムに(重複なし)
>>> import random
>>> random.sample(range(1,11), k=10)
[10, 7, 1, 9, 5, 3, 8, 2, 4, 6]
既にリストがある場合は、random.shuffle()
でシャッフルしてもランダムにできます。
>>> lst = list(range(1,11))
>>> random.shuffle(lst)
>>> lst
[5, 2, 10, 7, 1, 9, 8, 3, 6, 4]
要素を重複してもよいようにするには、以下のようにリスト内包表記を用いてrandom.choice()
で10回選択を繰り返します。
# 1から10までの整数をランダムに(重複許容)
>>> import random
>>> [random.choice(range(1,11)) for _ in range(10)]
[4, 6, 4, 5, 10, 8, 3, 9, 1, 1]
なおここで、for _ in range(10)
は単に10回繰り返すためだけのコードなので、変数_
はどこでも使用しません。このように、どこでも使わない(いわば使い捨て)の変数名には慣習的にアンダースコア1文字(_
)をよく用います。
また、random.choice(range(a, b + 1))
は、random.randint(a, b)
でも同じことが可能です。
>>> import random
>>> [random.randint(1,10) for _ in range(10)]
[3, 7, 4, 8, 8, 2, 4, 1, 2, 6]
同じランダムな要素が生成されるようにするには?
random.choice()
やrandom.randint()
は実行するたびにランダムに値を出力します。これを同じ値を出力するようにするには、random.seed()
で乱数生成器を初期化してから実行します。このかっこの中には適当な同じ値の整数を入力します(以下の例では毎回1
を入力します)。
>>> import random
>>> random.seed(1)
>>> [random.randint(1,10) for _ in range(10)]
[3, 10, 2, 5, 2, 8, 8, 8, 7, 4]
>>> random.seed(1)
>>> [random.choice(range(1,11)) for _ in range(10)]
[3, 10, 2, 5, 2, 8, 8, 8, 7, 4]
小数点数
# 0.1から1.0までを0.1刻みで
>>> [round(x * 0.1,1) for x in range(1, 11)]
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
>>> import numpy as np
>>> [round(float(x), 1) for x in np.linspace(0.1, 1, 10)]
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
ここでx
は「numpy.float64型」になるので、float(x)
でPythonの「float型」に変換しています。
ランダムな順にしたい場合は、整数のときにも用いたrandom.shuffle()
を使います。
# 0.1から1.0までの0.1刻みの値をランダムに
>>> lst = [round(x * 0.1,1) for x in range(1, 11)]
>>> random.shuffle(lst)
>>> lst
[0.2, 0.3, 0.5, 1.0, 0.4, 0.7, 0.1, 0.8, 0.6, 0.9]
アルファベット(文字)
アルファベットの文字は、標準モジュールのstring から以下のように取得できます。
>>> import string
>>> string.ascii_lowercase # 小文字
'abcdefghijklmnopqrstuvwxyz'
>>> string.ascii_uppercase # 大文字
'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
>>> string.ascii_letters # 小文字+大文字
'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
先頭の「a」から順に10個取得するには、[:10]
でスライスします。
# 小文字のアルファベットを「a」から10個
>>> import string
>>> list(string.ascii_lowercase[:10])
['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
# 大文字のアルファベットを「A」から10個
>>> import string
>>> list(string.ascii_uppercase[:10])
['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J']
最後の「z」から降順にするには、[::-1]
を使います。
# 小文字のアルファベットから「z」から10個
>>> import string
>>> list(string.ascii_lowercase[::-1][:10])
['z', 'y', 'x', 'w', 'v', 'u', 't', 's', 'r', 'q']
ランダムにするには、整数のときと同じくrandom.sample()
でサンプルを作成します。
# 小文字のアルファベットを「a」から10個をランダムに
>>> import string
>>> import random
>>> random.sample(string.ascii_lowercase[:10], k=10)
['c', 'j', 'b', 'a', 'f', 'h', 'i', 'g', 'e', 'd']
大文字と小文字のアルファベットからランダムに選ぶには、string.ascii_letters
を使います。
# 大文字と小文字のアルファベットからからランダムに10個
>>> import string
>>> import random
>>> random.sample(string.ascii_letters, k=10)
['j', 'I', 'L', 'J', 'z', 'U', 'N', 'A', 'E', 'S']
ここで、random.sample()
は、かっこの中のk=
の値が元のリストよりも大きいとエラーになります。例えば、以下のように4種類の血液型から10個サンプリングすることはできません。
>>> import random
>>> random.sample(["A", "B", "O", "AB"], k=10)
ValueError: Sample larger than population or is negative
10人分の血液型のリストのサンプルを作成するには、以下のようにリスト内包表記を用いて、10回random.choice()
を実行します。
>>> import random
>>> [random.choice(["A", "B", "O", "AB"]) for _ in range(10)]
['O', 'B', 'B', 'AB', 'O', 'A', 'AB', 'A', 'B', 'O']
アルファベット(文字列)
アルファベットの大文字から、「ABC」「EFG」…のように先頭から3文字ずつ連結した文字列を10個作成します。ここで、「Z」の次は「A」になるようにリピートさせます。そのために、以下のように回数ごとに3つずつずらしたアルファベットから3文字取得します。
# アルファベット大文字3つを順に連結した文字列を10個
>>> import string
>>> len(string.ascii_uppercase)
26
>>> [(string.ascii_uppercase[i * 3 % 26:]+ string.ascii_uppercase[:i * 3 % 26])[:3] for i in range(10)]
['ABC', 'DEF', 'GHI', 'JKL', 'MNO', 'PQR', 'STU', 'VWX', 'YZA', 'BCD']
# 4文字にする場合は、3 -> 4に変える
>>> [(string.ascii_uppercase[i * 4 % 26:]+ string.ascii_uppercase[:i * 4 % 26])[:4] for i in range(10)]
['ABCD', 'EFGH', 'IJKL', 'MNOP', 'QRST', 'UVWX', 'YZAB', 'CDEF', 'GHIJ', 'KLMN']
ランダムに選んだ3文字で文字列を作成するには、random.sample()
で得た3文字を"".join()
で1つの文字列に連結します。
# アルファベット3文字のランダムな文字列を10個
>>> import string
>>> import random
>>> ["".join(random.sample(string.ascii_uppercase, k=3)) for _ in range(10)]
['SZO', 'MNR', 'QXH', 'KEV', 'CDU', 'HNW', 'SOX', 'SDC', 'XGC', 'ROW']
アルファベットの文字を重複してもよいようにするには、少しコードが長くなりますが、以下のようにrandom.choice()
と使います。
# アルファベット3文字のランダムな文字列を10個(重複許容)
>>> import string
>>> import random
>>> ["".join([random.choice(string.ascii_uppercase) for _ in range(3)]) for _ in range(10)]
['AHD', 'GKK', 'IYW', 'VTC', 'AWU', 'NUH', 'OQB', 'JYT', 'ZDO', 'JYT']
数字(文字列)の要素
会員ID番号のように数字の文字列のサンプルをつくります。0から9までの数字は、先述の標準モジュールのstringから以下のように取得できます。
>>> import string
>>> string.digits
'0123456789'
アルファベット(文字列)のときと同じようにrandom.choice()
を用いて以下のように作成できます。ここでは、重複してもよい場合だけ実行してみます。
# 数字5文字のランダムな文字列を10個(重複許容)
>>> import string
>>> import random
>>> ["".join([random.choice(string.digits) for _ in range(5)]) for _ in range(10)]
['41993', '40236', '07992', '58587', '40860', '59056', '97575', '99060', '15125', '36114']