numpyを使わずに二重リストの行列を入れ替える
numpyを使えばいいと思われるかもしれませんが、競技プログラミングなどでは外部ライブラリを使えないことがあるので、zipを使ってリスト内包表記で解決します。
irekae.py
data = [[1, 5, 3], [2, 4, 6], [8, 1, 9]]
transposed = [ x for x in zip(*data)]
print(transposed)
実行結果
[(1, 2, 8), (5, 4, 1), (3, 6, 9)]
サイコロの偶奇判定
randint(a, b)は、a以上b以下ということでbも含まれることを時々忘れるので
備忘録として書いてみました。
even_or_odd.py
import random
dice_roll = random.randint(1, 6)
if dice_roll % 2 == 0:
print(dice_roll, "偶数")
else:
print(dice_roll, "奇数")
実行結果
3 奇数
サイコロの各目が出る確率を求める
Pythonの標準ライブラリcollectionsは、リスト、タプル、辞書などの基本的なデータ構造を拡張した特殊なデータ構造を提供します。Counterクラスを使うと、出現回数が多い順に要素を取得可能です。Counterはキーに要素、値に出現回数という形のデータを持ちます。
dice_roll.py
import random, collections
n = 100
result = []
for _ in range(n):
dice_roll = random.randint(1, 6)
result.append(dice_roll)
result.sort()
for num, count in collections.Counter(result).items():
print(num, f"{count / n:.3%}") # 小数点以下第3位までの%表記
実行結果
1 17.000%
2 21.000%
3 12.000%
4 16.000%
5 18.000%
6 16.000%
Collentionsのdeque
collectionsのdequeは、両端に対する要素の追加や削除が高速に行えるデータ構造です。但し中央部分の要素へのアクセスは遅いので、両端以外の要素へ頻繁にアクセスする場合はリストを使うほうがいいです。下のコード例のextendleft()は、指定したイテラブルの要素の順番が逆転されて連結されるので注意が必要です。
deque.py
from collections import deque
names = deque()
names = deque(["Charlie", "Ellen", "Jasmine"])
names.popleft() # 先頭の要素を削除
names.append("Michael")
names.appendleft("Bob") # 先頭に要素を追加
names.extendleft(["Abraham", "Anne", "Arthur"]) # 先頭に複数の要素を追加
print(names)
実行結果
deque(['Arthur', 'Anne', 'Abraham', 'Bob', 'Ellen', 'Jasmine', 'Michael'])