Python Tips: リストの中から要素をランダムにピックアップしたい

Pythonでリストの中から要素をランダムで抽出する方法をご紹介します。

ランダムで抽出する、というとき、抽出方法は2つあるかと思います。

  • 1つだけ抽出する
  • 複数抽出する

以下、それぞれについて見ていきます。

1つだけ抽出する

1つだけ抽出したいときは random ライブラリの choice 関数を使います。

import random

marks = ['club', 'diamond', 'heart', 'spade']
numbers = range(1, 14)
cards = [(m, n) for m in marks for n in numbers]

random.choice(cards)  # => トランプのカードのいずれか

たとえば、52枚のカードの束から1枚取り出して、そのカードをまた元に戻して、というように繰り返す場合なんかは、 random.choice を繰り返すような形で実現できます。

複数抽出する

複数枚抽出したいときは random ライブラリの sample 関数を使います。

import random

marks = ['club', 'diamond', 'heart', 'spade']
numbers = range(1, 14)
cards = [(m, n) for m in marks for n in numbers]

random.sample(cards, 5)
# => 52枚のカードの中からランダムに5枚

sample 関数は上のように2つの引数を受け取ります。1つめにはリストを、2つめには個数を指定します。

以上です。

上記の一組のトランプを使ったやり方でかんたんなモンテカルロ法なんかもできます。次のコードでは、トランプの束から抜き出した1枚の数が偶数の確率を求めています。

# トランプの束の中からカードを1枚だけ引くのを繰り返す
chosen_cards = []
for i in range(10000):
    c = random.choice(cards)
    chosen_cards.append(c)

# 引いたカードのうち数値が偶数となるカードが出た確率を計算して表示
even_cards_num = 0
for card in chosen_cards:
    if card[1] % 2 == 0:
        even_cards_num += 1

print(even_cards_num/len(chosen_cards))
# => 0.45ぐらいの数値

参考