---
title: Python AtCoder入門 第５講 リストの基礎と操作
tags: 
author: [佐藤](https://www.docswell.com/user/aomori_sato)
site: [Docswell](https://www.docswell.com/)
thumbnail: https://bcdn.docswell.com/page/K74W11GME1.jpg?width=480
description: Python AtCoder入門 第５講 リストの基礎と操作 by 佐藤
published: September 19, 26
canonical: https://www.docswell.com/s/aomori_sato/56N8D7-2026-09-19-211905
---
# Page. 1

![Page Image](https://bcdn.docswell.com/page/K74W11GME1.jpg)

Python AtCoder入門
第5講 リストの基礎と操作
ここから 第2部「データをまとめて扱う」 に入ります。
B問題では、 N 個のデータがまとめて与えられるのが当たり前です。
1


# Page. 2

![Page Image](https://bcdn.docswell.com/page/LJ1YGGDYEG.jpg)

今回のテーマ
そこで必要になるのが リスト です。
リストは、
たくさんの値を1つの変数にまとめて入れておく箱
です。
2


# Page. 3

![Page Image](https://bcdn.docswell.com/page/GJWGKKY172.jpg)

この講のゴール
この講では、リストを正面から扱います。
作成とアクセス
長さとインデックス
スライス
追加と削除
集計関数
コピーの罠
3


# Page. 4

![Page Image](https://bcdn.docswell.com/page/4EZLZZXX73.jpg)

コードファイル名の方針
この講でも、コード例ごとにファイル名を付けます。
list_basic.py
slice.py
append_pop.py
aggregate.py
copy_trap.py
answer_5_1.py
4


# Page. 5

![Page Image](https://bcdn.docswell.com/page/Y76WZZ4P7V.jpg)

5-1 リストの基本
リストは角括弧 [ ] で作ります。
A = [3, 1, 4, 1, 5]
複数の値を1つの変数にまとめられます。
5


# Page. 6

![Page Image](https://bcdn.docswell.com/page/G75MWWQP74.jpg)

インデックスでアクセスする
個々の要素には、インデックスでアクセスします。
A = [3, 1, 4, 1, 5]
print(A[0])
print(A[2])
1番目の要素は A[0] です。
6


# Page. 7

![Page Image](https://bcdn.docswell.com/page/9J29QQPZER.jpg)

list_access.py
A = [3, 1, 4, 1, 5]
print(A[0])
print(A[2])
出力：
3
4
7


# Page. 8

![Page Image](https://bcdn.docswell.com/page/DEY4WW5NJM.jpg)

インデックスは0から始まる
A = [3, 1, 4, 1, 5]
は3
A[1] は 1
A[2] は 4
Pythonでは番号を0から数えます。
A[0]
8


# Page. 9

![Page Image](https://bcdn.docswell.com/page/VJNY99NV78.jpg)

長さを調べる
要素の個数は len() で取れます。
A = [3, 1, 4, 1, 5]
print(len(A))
出力：
5
9


# Page. 10

![Page Image](https://bcdn.docswell.com/page/YE9P22RVJ3.jpg)

最後のインデックス
要素が5個なら、使えるインデックスは、
0, 1, 2, 3, 4
です。
最後のインデックスは、
len(A) - 1
10


# Page. 11

![Page Image](https://bcdn.docswell.com/page/GE8D55W4ED.jpg)

IndexError
A = [3, 1, 4, 1, 5]
print(A[5])
これはエラーになります。
IndexError
要素が5個でも、 A[5] は存在しません。
11


# Page. 12

![Page Image](https://bcdn.docswell.com/page/LELMYYNV7R.jpg)

負のインデックス
Pythonでは、後ろから数えることもできます。
A = [3, 1, 4, 1, 5]
print(A[-1])
print(A[-2])
A[-1]
は最後の要素です。
12


# Page. 13

![Page Image](https://bcdn.docswell.com/page/4JMYNNXNJW.jpg)

negative_index.py
A = [3, 1, 4, 1, 5]
print(A[-1])
print(A[-2])
出力：
5
1
13


# Page. 14

![Page Image](https://bcdn.docswell.com/page/PJR9DDN479.jpg)

値の変更
リストは、中身を書き換えられます。
A = [3, 1, 4, 1, 5]
A[0] = 100
print(A)
出力：
[100, 1, 4, 1, 5]
14


# Page. 15

![Page Image](https://bcdn.docswell.com/page/PEXQ11NZJX.jpg)

リストの出力
A = [3, 1, 4, 1, 5]
print(A)
出力：
[3, 1, 4, 1, 5]
これはデバッグには便利ですが、AtCoderの答えとしては多くの場合WAです。
15


# Page. 16

![Page Image](https://bcdn.docswell.com/page/3EK922NVED.jpg)

空白区切りで出力する
答えとして空白区切りで並べるなら、
print(*A)
を使います。
A = [3, 1, 4, 1, 5]
print(*A)
出力：
3 1 4 1 5
16


# Page. 17

![Page Image](https://bcdn.docswell.com/page/L73W44ZQ75.jpg)

list_basic.py
# Create a list
A = [3, 1, 4, 1, 5]
# Access by index
print(A[0], A[2])
# Length and the last element
print(len(A), A[-1])
# Modify an element
A[1] = 99
print(*A)
17


# Page. 18

![Page Image](https://bcdn.docswell.com/page/87DKQQRWJG.jpg)

list_basic.py の出力
3 4
5 5
3 99 4 1 5
print(*A)
により、空白区切りで出力されています。
18


# Page. 19

![Page Image](https://bcdn.docswell.com/page/VJPKLLWXE8.jpg)

5-2 スライス
スライスは、リストの一部を切り出して、
新しいリストとして取り出す
書き方です。
A = [0, 1, 2, 3, 4, 5]
print(A[2:5])
19


# Page. 20

![Page Image](https://bcdn.docswell.com/page/2EVVQQ83EQ.jpg)

A[i:j]
A[i:j]
は、インデックス i 以上 j 未満を取り出します。
A = [0, 1, 2, 3, 4, 5]
print(A[2:5])
出力：
[2, 3, 4]
20


# Page. 21

![Page Image](https://bcdn.docswell.com/page/57GLWW5YEL.jpg)

スライスの形
書き方
A[i:j]
A[i:]
A[:j]
A[:]
A[::-1]
意味
i以上j未満
iから最後まで
最初からj未満
全部
逆順
例
A[2:5]
A[3:]
A[:3]
A[:]
A[::-1]
21


# Page. 22

![Page Image](https://bcdn.docswell.com/page/4EQY33Z6JP.jpg)

A[::-1]
A = [0, 1, 2, 3, 4, 5]
print(A[::-1])
出力：
[5, 4, 3, 2, 1, 0]
逆順にしたいときの定石です。
22


# Page. 23

![Page Image](https://bcdn.docswell.com/page/KJ4W113M71.jpg)

スライスは新しいリストを作る
重要な性質です。
スライスは、元のリストを変えずに新しいリストを作ります。
この性質は、後で扱う「コピーの罠」で重要になります。
23


# Page. 24

![Page Image](https://bcdn.docswell.com/page/LE1YGG1Y7G.jpg)

slice.py
A = [0, 1, 2, 3, 4, 5]
# Extract a range
print(*A[2:5])
# From index 3 to the end
print(*A[3:])
# Reverse
print(*A[::-1])
# The original list is unchanged
print(*A)
24


# Page. 25

![Page Image](https://bcdn.docswell.com/page/GEWGKK81J2.jpg)

slice.py の出力
2 3 4
3 4 5
5 4 3 2 1 0
0 1 2 3 4 5
最後の行に注目してください。
A 自身は変わっていません。
25


# Page. 26

![Page Image](https://bcdn.docswell.com/page/47ZLZZ8XJ3.jpg)

5-3 要素の追加・削除
リストには、あとから要素を追加したり削除したりできます。
ここでは、よく使うメソッドを確認します。
26


# Page. 27

![Page Image](https://bcdn.docswell.com/page/YJ6WZZPPJV.jpg)

追加のメソッド
メソッド
A.append(x)
A.insert(i, x)
意味
末尾に x を追加する
インデックス i の位置に x を挿入する
競技プログラミングでは、 append が特によく出ます。
27


# Page. 28

![Page Image](https://bcdn.docswell.com/page/GJ5MWWKPJ4.jpg)

append
A = [1, 2, 3]
A.append(4)
print(A)
出力：
[1, 2, 3, 4]
末尾に追加します。
28


# Page. 29

![Page Image](https://bcdn.docswell.com/page/LE3W44Z6E5.jpg)

appendの定番パターン
空のリストを用意して、ループの中で追加します。
A = []
for i in range(5):
A.append(i * i)
print(*A)
出力：
0 1 4 9 16
29


# Page. 30

![Page Image](https://bcdn.docswell.com/page/8EDKQQRM7G.jpg)

削除のメソッド
メソッド
A.pop()
A.pop(i)
A.remove(x)
意味
末尾の要素を取り除いて返す
インデックス i の要素を取り除いて返す
値が x である最初の要素を取り除く
30


# Page. 31

![Page Image](https://bcdn.docswell.com/page/V7PKLLWQJ8.jpg)

pop
A = [3, 1, 4, 1, 5]
x = A.pop()
print(x)
print(A)
出力：
5
[3, 1, 4, 1]
31


# Page. 32

![Page Image](https://bcdn.docswell.com/page/2JVVQQ8PJQ.jpg)

remove
A = [3, 1, 4, 1, 5]
A.remove(1)
print(A)
出力：
[3, 4, 1, 5]
最初に見つかった 1 だけが消えます。
32


# Page. 33

![Page Image](https://bcdn.docswell.com/page/5EGLWW5QJL.jpg)

removeの注意
には注意点があります。
消えるのは最初に見つかった1個だけ
その値が存在しないと ValueError になる
「あれば消す」なら、事前に存在確認が必要です。
remove
33


# Page. 34

![Page Image](https://bcdn.docswell.com/page/4JQY33ZW7P.jpg)

append_pop.py
# Build a list with append
A = []
for i in range(1, 6):
A.append(i * 10)
print(*A)
# Remove the last element
last = A.pop()
print(last)
print(*A)
# Insert at the front
A.insert(0, 5)
print(*A)
34


# Page. 35

![Page Image](https://bcdn.docswell.com/page/K74W1131E1.jpg)

append_pop.py の出力
10 20 30 40 50
50
10 20 30 40
5 10 20 30 40
append
、 pop 、 insert の動きを確認しましょう。
35


# Page. 36

![Page Image](https://bcdn.docswell.com/page/LJ1YGG15EG.jpg)

5-4 集計関数と存在判定
リストには、便利な関数やメソッドがたくさんあります。
第4講では for で自力で書いた処理も、1行で済むことがあります。
36


# Page. 37

![Page Image](https://bcdn.docswell.com/page/GJWGKK8W72.jpg)

集計関数
書き方
len(A)
sum(A)
max(A)
min(A)
A.count(x)
意味
要素数
合計
最大値
最小値
x が何個あるか
37


# Page. 38

![Page Image](https://bcdn.docswell.com/page/4EZLZZ8273.jpg)

aggregate_basic.py
A = [3, 1, 4, 1, 5]
print(len(A), sum(A), max(A), min(A))
print(A.count(1))
出力：
5 14 5 1
2
38


# Page. 39

![Page Image](https://bcdn.docswell.com/page/Y76WZZK67V.jpg)

空のリストに注意
max(A)
min(A)
は、空のリストに使うと ValueError になります。
要素が0個になり得る場面では注意してください。
39


# Page. 40

![Page Image](https://bcdn.docswell.com/page/G75MWWP574.jpg)

存在判定 in
その値がリストに含まれているかは、
in
で調べられます。
A = [3, 1, 4, 1, 5]
print(4 in A)
print(9 in A)
40


# Page. 41

![Page Image](https://bcdn.docswell.com/page/9J29QQ6GER.jpg)

in_basic.py
A = [3, 1, 4, 1, 5]
print(4 in A)
print(9 in A)
出力：
True
False
存在するかだけを知りたいなら、 in が簡潔です。
41


# Page. 42

![Page Image](https://bcdn.docswell.com/page/DEY4WW9GJM.jpg)

Yes / No にする
if X in A:
print(&quot;Yes&quot;)
else:
print(&quot;No&quot;)
第4講のフラグパターンを、1行の条件で書けます。
42


# Page. 43

![Page Image](https://bcdn.docswell.com/page/VJNY99L878.jpg)

inの注意
リストの in は、先頭から順に全部調べます。
そのため、巨大なリストに対してループの中で何度も使うと遅くなります。
この話は第10講で扱います。
43


# Page. 44

![Page Image](https://bcdn.docswell.com/page/YE9P224XJ3.jpg)

index
その値が何番目にあるかは、 index() で取れます。
A = [3, 1, 4, 1, 5]
print(A.index(4))
print(A.index(1))
index()
は、最初に見つかった位置だけを返します。
44


# Page. 45

![Page Image](https://bcdn.docswell.com/page/GE8D55Q9ED.jpg)

aggregate.py
# Read N and the list of N integers
N = int(input())
A = list(map(int, input().split()))
# Aggregate
print(len(A), sum(A), max(A), min(A))
入力例：
5
3 1 4 1 5
出力例：
5 14 5 1
45


# Page. 46

![Page Image](https://bcdn.docswell.com/page/LELMYYXM7R.jpg)

max_position.py
# Read N and the list of N integers
N = int(input())
A = list(map(int, input().split()))
# Find the maximum and its 1-indexed position
best = max(A)
position = A.index(best) + 1
print(position, best)
46


# Page. 47

![Page Image](https://bcdn.docswell.com/page/4JMYNNL6JW.jpg)

max_position.py の実行例
入力例：
5
3 1 5 1 5
出力例：
3 5
最大値 5 は複数ありますが、最初の位置が返ります。
47


# Page. 48

![Page Image](https://bcdn.docswell.com/page/PJR9DDKN79.jpg)

+1を忘れない
は0始まりの位置を返します。
問題文が1始まりなら、
index()
position = A.index(best) + 1
のように + 1 が必要です。
48


# Page. 49

![Page Image](https://bcdn.docswell.com/page/PEXQ11L8JX.jpg)

5-5 リストのコピーの罠
この節は短いですが、本講で最も重要です。
ここを知らないと、原因のわからないバグに何時間も悩むことがあります。
49


# Page. 50

![Page Image](https://bcdn.docswell.com/page/3EK922LLED.jpg)

b = a はコピーではない
まず、次のコードを見てください。
a = [1, 2, 3]
b = a
b[0] = 100
print(a)
b
を変えたのに、 a も変わります。
50


# Page. 51

![Page Image](https://bcdn.docswell.com/page/L73W443675.jpg)

copy_trap.py
a = [1, 2, 3]
b = a
b[0] = 100
print(a)
print(b)
出力：
[100, 2, 3]
[100, 2, 3]
51


# Page. 52

![Page Image](https://bcdn.docswell.com/page/87DKQQ4MJG.jpg)

同じリストに別名を付けている
b = a
は、中身を複製していません。
同じリストに別の名前を付けているだけ
です。
片方を変更すると、もう片方も変わります。
52


# Page. 53

![Page Image](https://bcdn.docswell.com/page/VJPKLLMQE8.jpg)

正しくコピーする
独立した別のリストが欲しいときは、次のいずれかを使います。
書き方
b = a[:]
b = list(a)
b = a.copy()
説明
スライスで全体を取り出す
リストを作り直す
コピー用のメソッド
53


# Page. 54

![Page Image](https://bcdn.docswell.com/page/2EVVQQ9PEQ.jpg)

copy_ok.py
a = [1, 2, 3]
b = a[:]
b[0] = 100
print(a)
print(b)
出力：
[1, 2, 3]
[100, 2, 3]
今度は a が変わっていません。
54


# Page. 55

![Page Image](https://bcdn.docswell.com/page/57GLWWZQEL.jpg)

copy_trap_compare.py
# Case 1: b = a
a = [1, 2, 3]
b = a
b[0] = 100
print(*a)
print(*b)
# Case 2: b = a[:]
a = [1, 2, 3]
b = a[:]
b[0] = 100
print(*a)
print(*b)
55


# Page. 56

![Page Image](https://bcdn.docswell.com/page/4EQY33LWJP.jpg)

copy_trap_compare.py の出力
100 2 3
100 2 3
1 2 3
100 2 3
上の2行は同じ、下の2行は違います。
この差がすべてです。
56


# Page. 57

![Page Image](https://bcdn.docswell.com/page/KJ4W11D171.jpg)

元を残したまま操作したいとき
コピーの罠は、
元のリストを残したまま、加工したものも欲しい
という場面で問題になります。
例：
元の順序も出力する
並べ替えた結果も出力する
2倍したリストも作る
57


# Page. 58

![Page Image](https://bcdn.docswell.com/page/LE1YGGZ57G.jpg)

double_copy.py
# Read N and the list of N integers
N = int(input())
A = list(map(int, input().split()))
# Make an independent copy and double every element
B = A[:]
for i in range(N):
B[i] = B[i] * 2
# The original list is still intact
print(*A)
print(*B)
58


# Page. 59

![Page Image](https://bcdn.docswell.com/page/GEWGKK9WJ2.jpg)

double_copy.py の実行例
入力例：
5
3 1 4 1 5
出力例：
3 1 4 1 5
6 2 8 2 10
A
は元のまま残っています。
59


# Page. 60

![Page Image](https://bcdn.docswell.com/page/47ZLZZ92J3.jpg)

章末まとめ
リストは [ ] で作ります。
インデックスは0始まりです。
A[0]
が1番目の要素です。
最後のインデックスは len(A) - 1 です。
60


# Page. 61

![Page Image](https://bcdn.docswell.com/page/YJ6WZZD6JV.jpg)

章末まとめ：出力
リストをそのまま出すと、角括弧が付きます。
print(A)
答えとして並べるなら、
print(*A)
を使います。
61


# Page. 62

![Page Image](https://bcdn.docswell.com/page/GJ5MWW35J4.jpg)

章末まとめ：スライス
A[i:j]
は、 i 以上 j 未満です。
A[::-1]
で逆順にできます。
スライスは元のリストを変えず、新しいリストを作ります。
62


# Page. 63

![Page Image](https://bcdn.docswell.com/page/9E29QQZG7R.jpg)

章末まとめ：集計
よく使う集計は次の通りです。
len(A)
sum(A)
max(A)
min(A)
A.count(x)
存在判定は X in A です。
63


# Page. 64

![Page Image](https://bcdn.docswell.com/page/D7Y4WWRGEM.jpg)

章末まとめ：コピー
b = a
はコピーではありません。
同じリストに別名を付けているだけです。
独立したコピーが欲しいなら、
b = a[:]
を使います。
64


# Page. 65

![Page Image](https://bcdn.docswell.com/page/VENY99D8J8.jpg)

練習問題 5-1 合計・最大・最小
個の整数 A_1, A_2, ..., A_N が与えられます。
合計、最大値、最小値を、この順に空白区切りで1行に出力してください。
N
65


# Page. 66

![Page Image](https://bcdn.docswell.com/page/Y79P22GXE3.jpg)

練習問題 5-1：入力と出力
入力：
N
A_1 A_2 ... A_N
入力例：
5
30 10 40 10 50
出力例：
140 50 10
66


# Page. 67

![Page Image](https://bcdn.docswell.com/page/G78D55V97D.jpg)

answer_5_1.py
# Read N and the list of N integers
N = int(input())
A = list(map(int, input().split()))
# Print the sum, the maximum, and the minimum
print(sum(A), max(A), min(A))
集計関数をそのまま使います。
67


# Page. 68

![Page Image](https://bcdn.docswell.com/page/L7LMYY5MJR.jpg)

練習問題 5-2 逆順に出力
個の整数 A_1, A_2, ..., A_N が与えられます。
これらを逆順に並べ替えて、空白区切りで1行に出力してください。
N
68


# Page. 69

![Page Image](https://bcdn.docswell.com/page/4EMYNN36EW.jpg)

練習問題 5-2：入力と出力
入力：
N
A_1 A_2 ... A_N
入力例：
5
3 1 4 1 5
出力例：
5 1 4 1 3
69


# Page. 70

![Page Image](https://bcdn.docswell.com/page/PER9DDQNJ9.jpg)

answer_5_2.py
# Read N and the list of N integers
N = int(input())
A = list(map(int, input().split()))
# Print the list in reverse order
print(*A[::-1])
print(A[::-1])
ではなく、 print(*A[::-1]) です。
70


# Page. 71

![Page Image](https://bcdn.docswell.com/page/P7XQ1158EX.jpg)

練習問題 5-3 元のリストと2倍したリスト
個の整数 A_1, A_2, ..., A_N が与えられます。
1行目に元の数列を出力します。
2行目に各要素を2倍した数列を出力します。
N
71


# Page. 72

![Page Image](https://bcdn.docswell.com/page/37K9226L7D.jpg)

練習問題 5-3：入力と出力
入力：
N
A_1 A_2 ... A_N
入力例：
4
2 7 1 8
出力例：
2 7 1 8
4 14 2 16
72


# Page. 73

![Page Image](https://bcdn.docswell.com/page/LJ3W4466J5.jpg)

answer_5_3.py
# Read N and the list of N integers
N = int(input())
A = list(map(int, input().split()))
# Make an independent copy and double every element
B = A[:]
for i in range(N):
B[i] = B[i] * 2
print(*A)
print(*B)
73


# Page. 74

![Page Image](https://bcdn.docswell.com/page/8JDKQQVMEG.jpg)

appendで新しく作る方法
# Read N and the list of N integers
N = int(input())
A = list(map(int, input().split()))
# Build a new list without touching A
B = []
for x in A:
B.append(x * 2)
print(*A)
print(*B)
74


# Page. 75

![Page Image](https://bcdn.docswell.com/page/VEPKLLVQ78.jpg)

第5講まとめ
この講では、
リストの基礎と操作
を学びました。
B問題では、リストを使ってN個のデータをまとめて処理する場面が一気に増えます。
75


# Page. 76

![Page Image](https://bcdn.docswell.com/page/27VVQQZP7Q.jpg)

次回予告
次の第6講では、
タプルと内包表記
を扱います。
B = [] と append で組み立てたリストが、たった1行で書けるようになります。
76


