🍵

競プロ私的スニペット Python3 配列編

2023/11/26に公開

配列を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