【Python】リストを分割する

IT
  • リストを分割したい時に①リスト[start:end]の境界値の動き方と②割り切れない長さの場合でハマったので備忘memo

    • ①結論:リスト[start:end]の場合、end番目の要素が含まれない
    • ②結論:最後のループ処理の時にリスト[start:None]とする
  • 処理漏れが無ければ問題ない時に使用可能

  • 下記コードは1~20の数値が順番に入っているリストを3分割にする場合

    • 汎用的にしたかったため、3分割と決め打ちにする場合より、コードがやや冗長になっています

コードmemo

list_length = 20
divide_num = 3

test_list = []
for num in range(list_length):
    test_list.append(num+1)
print("リスト:", test_list)

chunk = len(test_list) // divide_num
repeat_num = len(test_list)//chunk
for chunk_num in range(0, repeat_num):
    start = chunk_num*chunk
    end = start + chunk if chunk_num != repeat_num - 1  else None
    temp_list = test_list[start:end]
    print(chunk_num+1, "分割目:", temp_list)

実行結果

リスト: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
1 分割目: [1, 2, 3, 4, 5, 6]
2 分割目: [7, 8, 9, 10, 11, 12]
3 分割目: [13, 14, 15, 16, 17, 18, 19, 20]

memo

リスト[start:end]のendの扱い

  • temp_listが1\~20の数値が順番に入っているリストの場合、temp_list[0:9]は0\~9番目の要素が入っていると勘違いしていた
  • この場合、9番目が含まれないため、リストとしては0~8番目のリストになる
  • 0\~9番目、10\~19番目のリストに分割したい場合にはtest_list[0:10]test_list[10:20]となるよう指定する必要がある
print(test_list)
print(test_list[0:9])
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

余った要素を最後の分割に入れる

  • end = start + chunk if chunk_num != repeat_num - 1 else Noneでループ処理の最後の時はendNoneを代入
    • Noneを入れるとリスト末尾まで取得する
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[5:None])
[5, 6, 7, 8, 9]

コメント

タイトルとURLをコピーしました