Pythonのrandom.shuffle()を使ってリストをランダムに並び替える

はじめに

Python の random.shuffle() は list の内容をランダムに並び替えてくれる関数です。

この関数を使って、複数ある作業を各担当者にランダムに振り分けるスクリプトを作ってみました。(誰がどの作業を担当しても大丈夫という条件付きですが。)


やること

  • 作業一覧をファイルに羅列する。(1行につき1作業)
  • Pythonで作業一覧をランダムに並び替える。
  • ランダムに並び替えた作業一覧を1つずつ担当者に割り振る。(トランプをシャッフルしてみんなに配るイメージ)


作成物

[tasks.txt]

タスク1
タスク2
タスク3
タスク4
タスク5
タスク6
タスク7
タスク8
タスク9


[random_task.py]

import random

# 作業メンバー
members = [
    'メンバー1',
    'メンバー2',
    'メンバー3'
]

# 作業タスクを読み込む
with open('./tasks.txt', mode='r', encoding='utf-8') as f:
    # list()やreadlines()で読み込むと改行コードが含まれるのでsplitlines()を使う
    tasks = f.read().splitlines()

# 空のタスクを除去
tasks = list(filter(None, tasks))

# tasks.txtの順に並んでいる作業タスクをランダムに並び替える
random.shuffle(tasks)

# ランダムに並び替えたタスクをメンバーに振り分ける
assign = list(range(len(members)))
for i in range(len(members)):
    assign[i] = []
for i, task in enumerate(tasks):
    assign[i % len(members)].append(task)

# メンバー毎のタスクを表示
for i in range(len(members)):
    assign[i].sort()
    print(f'{members[i]}:{assign[i]}')


実行結果

$ python random_task.py
メンバー1:['タスク1', 'タスク5', 'タスク9']
メンバー2:['タスク2', 'タスク3', 'タスク8']
メンバー3:['タスク4', 'タスク6', 'タスク7']


さいごに

こんなものを書いておいてあれですが、ちゃんとメンバーと向き合って作業を割り振るのが一番だと思うので、このコードが使われないことを祈ります。