🍵
競プロ私的スニペット Python3 配列編
配列をn個区切りで分割する
例えば、スケジュールを模した以下にような配列がある場合(Trueが仕事の日でFalseが休日)、
days = [True, True, True, False, True, True, True, False, True, True, False]
1週間ごとに分割するみたいなことが必要になる場合がある。
その場合7個区切りで配列の配列が作れる。
[days[i:i + 7] for i in range(0, len(days), 7)]
# => [[True, True, True, False, True, True, True], [False, True, True, False]]
部分配列の生成
lst = [1, 2, 3]
[lst[i:j] for i in range(len(lst)) for j in range(i + 1, len(lst) + 1)]
# => [[1], [1, 2], [1, 2, 3], [2], [2, 3], [3]]
※ [] のような空のリストは含まず、元の配列と完全に一致するものも含む(この例だと[1, 2, 3]も含む)
複数のリストの直積(デカルト積)を作る
from itertools import product
suits = ["❤️", "♦️", "♣️", "♠️"]
values = ["A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K"]
for card in product(suits, values):
suit, value = card
print(f"{suit}の{value}")
累積和の算出
from itertools import accumulate
lst = [2, 0, 0, 5, 1]
result = list(accumulate(lst))
print(result) # 出力: [2, 2, 2, 7, 8]
順序を保ちならが重複を排除
リストから重複を排除する最も一般的な方法はセットを使用することだが、セットだと順序が保持できないため以下で対応
def remove_duplicates(lst):
seen = set()
new_lst = []
for item in lst:
if item not in seen:
seen.add(item)
new_lst.append(item)
return new_lst
uniq_sorted_a = remove_duplicates(sorted(A))
Discussion