-
リストを分割したい時に①
リスト[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
でループ処理の最後の時はend
にNone
を代入- Noneを入れるとリスト末尾まで取得する
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[5:None])
[5, 6, 7, 8, 9]
コメント