Pythonリストとは?配列の基本的な作り方と使い方
Python初心者向けにリストの基本概念から実践的な使い方まで詳しく解説。要素の追加・削除、インデックス操作、リスト内包表記を学びます。
Pythonリストとは?配列の基本的な作り方と使い方
みなさん、Pythonを学んでいて「リストって何?」と思ったことはありませんか?
「複数のデータをまとめて管理したい」「配列とどう違うの?」
こんな疑問を抱いている初心者の方も多いでしょう。
実は、Pythonのリストは複数のデータを効率的に管理するための重要なデータ構造です。 リストを使いこなせるようになると、より実用的で効率的なプログラムを作成できます。
この記事では、Python初心者でも理解できるように、リストの基本から実践的な活用方法まで、豊富な例とともに詳しく解説します。 あなたもリストを使って、もっと便利なプログラムを作ってみませんか?
リストって何?基本的な概念
まず、リストがなぜ重要なのかを理解しましょう。
リストがない場合の問題
リストを使わずにデータを管理しようとすると、こんな問題が起こります。
# リストを使わない場合の問題student1 = "田中"student2 = "佐藤"student3 = "山田"student4 = "鈴木"student5 = "高橋"
print(f"生徒1: {student1}")print(f"生徒2: {student2}")print(f"生徒3: {student3}")print(f"生徒4: {student4}")print(f"生徒5: {student5}")
実行結果はこちらです。
生徒1: 田中
生徒2: 佐藤
生徒3: 山田
生徒4: 鈴木
生徒5: 高橋
この方法では、変数がたくさん必要になります。 生徒の追加・削除が困難で、まとめて処理することもできません。
リストを使った解決法
同じデータをリストで管理すると、とても簡単になります。
# リストを使った場合students = ["田中", "佐藤", "山田", "鈴木", "高橋"]
print(f"生徒リスト: {students}")print(f"生徒数: {len(students)}人")
print("全員の名前を表示:")for i, student in enumerate(students, 1): print(f"生徒{i}: {student}")
実行結果はこちらです。
生徒リスト: ['田中', '佐藤', '山田', '鈴木', '高橋']
生徒数: 5人
全員の名前を表示:
生徒1: 田中
生徒2: 佐藤
生徒3: 山田
生徒4: 鈴木
生徒5: 高橋
リストの利点
- 一つの変数で複数のデータを管理
- 簡単に要素の追加・削除が可能
- ループ処理でまとめて操作できる
リストの特徴
Pythonのリストには、以下のような特徴があります。
主な特徴
- 順序がある: 要素には0から始まるインデックスが付く
- 変更可能: 作成後に要素の追加・削除・変更ができる
- 重複OK: 同じ値を複数回格納できる
- 異なる型OK: 文字列、数値、真偽値などを混在できる
- 動的サイズ: 必要に応じてサイズが自動的に変更される
実際の例を見てみましょう。
# 数値のリストscores = [85, 92, 78, 96, 73]print(f"テスト成績: {scores}")
# 文字列のリストcolors = ["赤", "青", "緑", "黄", "紫"]print(f"好きな色: {colors}")
# 混在したリストmixed_list = ["田中", 25, True, 175.5]print(f"混在リスト: {mixed_list}")
# 空のリストempty_list = []print(f"空のリスト: {empty_list}")
実行結果はこちらです。
テスト成績: [85, 92, 78, 96, 73]
好きな色: ['赤', '青', '緑', '黄', '紫']
混在リスト: ['田中', 25, True, 175.5]
空のリスト: []
とても柔軟で使いやすいですね。
リストの作成と基本操作
リストの作成方法と基本的な操作を詳しく学びましょう。
リストの作成方法
リストを作成する方法はいくつかあります。
# 直接作成fruits = ["りんご", "バナナ", "オレンジ"]print(f"果物リスト: {fruits}")
# 数値のリストnumbers = [1, 2, 3, 4, 5]print(f"数値リスト: {numbers}")
# 空のリストempty_list = []print(f"空のリスト: {empty_list}")
list()関数を使った作成方法もあります。
# list()関数を使用char_list = list("Python")print(f"文字リスト: {char_list}")
# range()からリスト作成range_list = list(range(1, 6))print(f"範囲リスト: {range_list}")
実行結果はこちらです。
文字リスト: ['P', 'y', 't', 'h', 'o', 'n']
範囲リスト: [1, 2, 3, 4, 5]
リスト内包表記という便利な方法もあります。
# 1から10までの偶数even_numbers = [x for x in range(1, 11) if x % 2 == 0]print(f"偶数リスト: {even_numbers}")
# 平方数のリストsquares = [x**2 for x in range(1, 6)]print(f"平方数: {squares}")
実行結果はこちらです。
偶数リスト: [2, 4, 6, 8, 10]
平方数: [1, 4, 9, 16, 25]
リスト内包表記は慣れると、とても便利な機能です。
インデックスとスライス
リストの要素にアクセスする方法を学びましょう。
fruits = ["りんご", "バナナ", "オレンジ", "ぶどう", "メロン"]print(f"果物リスト: {fruits}")print(f"インデックス: 0 1 2 3 4")
正のインデックスで要素にアクセスします。
# 正のインデックスprint(f"fruits[0] = {fruits[0]}") # 最初の要素print(f"fruits[1] = {fruits[1]}") # 2番目の要素print(f"fruits[2] = {fruits[2]}") # 3番目の要素
負のインデックスも使えます。
# 負のインデックスprint(f"fruits[-1] = {fruits[-1]}") # 最後の要素print(f"fruits[-2] = {fruits[-2]}") # 最後から2番目
実行結果はこちらです。
fruits[0] = りんご
fruits[1] = バナナ
fruits[2] = オレンジ
fruits[-1] = メロン
fruits[-2] = ぶどう
スライスで複数の要素を取得できます。
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
# 基本的なスライスprint(f"numbers[2:5] = {numbers[2:5]}") # インデックス2から4までprint(f"numbers[:5] = {numbers[:5]}") # 最初から5つprint(f"numbers[5:] = {numbers[5:]}") # インデックス5から最後まで
# ステップ付きスライスprint(f"numbers[::2] = {numbers[::2]}") # 2つおきに取得print(f"numbers[::-1] = {numbers[::-1]}") # 逆順
実行結果はこちらです。
numbers[2:5] = [2, 3, 4]
numbers[:5] = [0, 1, 2, 3, 4]
numbers[5:] = [5, 6, 7, 8, 9]
numbers[::2] = [0, 2, 4, 6, 8]
numbers[::-1] = [9, 8, 7, 6, 5, 4, 3, 2, 1, 0]
スライスは、データの一部を取り出すのにとても便利です。
リストの要素操作
リストの要素を追加、削除、変更する方法を詳しく学びましょう。
要素の追加
リストに要素を追加する方法はいくつかあります。
append() - 末尾に一つの要素を追加
fruits = ["りんご", "バナナ"]print(f"初期リスト: {fruits}")
fruits.append("オレンジ")print(f"append('オレンジ') 後: {fruits}")
fruits.append("ぶどう")print(f"append('ぶどう') 後: {fruits}")
実行結果はこちらです。
初期リスト: ['りんご', 'バナナ']
append('オレンジ') 後: ['りんご', 'バナナ', 'オレンジ']
append('ぶどう') 後: ['りんご', 'バナナ', 'オレンジ', 'ぶどう']
insert() - 指定位置に要素を追加
numbers = [1, 2, 4, 5]print(f"初期リスト: {numbers}")
numbers.insert(2, 3) # インデックス2に3を挿入print(f"insert(2, 3) 後: {numbers}")
numbers.insert(0, 0) # 先頭に0を挿入print(f"insert(0, 0) 後: {numbers}")
実行結果はこちらです。
初期リスト: [1, 2, 4, 5]
insert(2, 3) 後: [1, 2, 3, 4, 5]
insert(0, 0) 後: [0, 1, 2, 3, 4, 5]
extend() - 複数の要素を追加
colors = ["赤", "青"]print(f"初期リスト: {colors}")
colors.extend(["緑", "黄"])print(f"extend(['緑', '黄']) 後: {colors}")
実行結果はこちらです。
初期リスト: ['赤', '青']
extend(['緑', '黄']) 後: ['赤', '青', '緑', '黄']
+演算子でリストを結合することもできます。
list1 = [1, 2, 3]list2 = [4, 5, 6]
combined = list1 + list2print(f"list1 + list2: {combined}")print(f"元のlist1: {list1}") # 変更されない
実行結果はこちらです。
list1 + list2: [1, 2, 3, 4, 5, 6]
元のlist1: [1, 2, 3]
要素の削除
リストから要素を削除する方法もいくつかあります。
remove() - 値を指定して削除
fruits = ["りんご", "バナナ", "オレンジ", "バナナ", "ぶどう"]print(f"初期リスト: {fruits}")
fruits.remove("バナナ") # 最初のバナナだけ削除print(f"remove('バナナ') 後: {fruits}")
実行結果はこちらです。
初期リスト: ['りんご', 'バナナ', 'オレンジ', 'バナナ', 'ぶどう']
remove('バナナ') 後: ['りんご', 'オレンジ', 'バナナ', 'ぶどう']
pop() - インデックスを指定して削除
numbers = [10, 20, 30, 40, 50]print(f"初期リスト: {numbers}")
removed_item = numbers.pop() # 最後の要素を削除して返すprint(f"pop() で削除: {removed_item}")print(f"削除後のリスト: {numbers}")
removed_item = numbers.pop(1) # インデックス1を削除print(f"pop(1) で削除: {removed_item}")print(f"削除後のリスト: {numbers}")
実行結果はこちらです。
初期リスト: [10, 20, 30, 40, 50]
pop() で削除: 50
削除後のリスト: [10, 20, 30, 40]
pop(1) で削除: 20
削除後のリスト: [10, 30, 40]
del文 - インデックスや範囲を指定して削除
letters = ["a", "b", "c", "d", "e", "f", "g"]print(f"初期リスト: {letters}")
del letters[2] # インデックス2を削除print(f"del letters[2] 後: {letters}")
del letters[1:3] # インデックス1から2を削除print(f"del letters[1:3] 後: {letters}")
実行結果はこちらです。
初期リスト: ['a', 'b', 'c', 'd', 'e', 'f', 'g']
del letters[2] 後: ['a', 'b', 'd', 'e', 'f', 'g']
del letters[1:3] 後: ['a', 'e', 'f', 'g']
要素の変更と検索
リストの要素を変更したり、検索したりする方法を学びましょう。
要素の変更
fruits = ["りんご", "バナナ", "オレンジ"]print(f"初期リスト: {fruits}")
# 単一要素の変更fruits[1] = "いちご"print(f"インデックス1を変更: {fruits}")
# 複数要素の変更(スライス)numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]numbers[2:5] = [30, 40, 50]print(f"インデックス2-4を変更: {numbers}")
実行結果はこちらです。
初期リスト: ['りんご', 'バナナ', 'オレンジ']
インデックス1を変更: ['りんご', 'いちご', 'オレンジ']
インデックス2-4を変更: [1, 2, 30, 40, 50, 6, 7, 8, 9, 10]
in演算子で要素の存在確認ができます。
shopping_list = ["牛乳", "パン", "卵", "チーズ"]items_to_check = ["牛乳", "肉", "卵", "魚"]
for item in items_to_check: if item in shopping_list: print(f"✓ {item} はリストにあります") else: print(f"✗ {item} はリストにありません")
実行結果はこちらです。
✓ 牛乳 はリストにあります
✗ 肉 はリストにありません
✓ 卵 はリストにあります
✗ 魚 はリストにありません
index()メソッドで要素のインデックスを取得できます。
animals = ["犬", "猫", "鳥", "魚", "猫", "馬"]
cat_index = animals.index("猫")print(f"'猫'の最初のインデックス: {cat_index}")
bird_index = animals.index("鳥")print(f"'鳥'のインデックス: {bird_index}")
実行結果はこちらです。
'猫'の最初のインデックス: 1
'鳥'のインデックス: 2
count()メソッドで要素の個数を数えることができます。
numbers = [1, 2, 3, 2, 4, 2, 5, 2, 6]
count_2 = numbers.count(2)print(f"2の個数: {count_2}")
count_7 = numbers.count(7)print(f"7の個数: {count_7}")
実行結果はこちらです。
2の個数: 4
7の個数: 0
リストの高度な操作
より効率的なリスト操作の方法を学びましょう。
ソートと並び替え
リストを並び替える方法はいくつかあります。
sort()メソッド - リストを直接ソート
numbers = [64, 34, 25, 12, 22, 11, 90]print(f"元のリスト: {numbers}")
numbers.sort() # 昇順ソートprint(f"昇順ソート後: {numbers}")
numbers.sort(reverse=True) # 降順ソートprint(f"降順ソート後: {numbers}")
実行結果はこちらです。
元のリスト: [64, 34, 25, 12, 22, 11, 90]
昇順ソート後: [11, 12, 22, 25, 34, 64, 90]
降順ソート後: [90, 64, 34, 25, 22, 12, 11]
sorted()関数 - 新しいソート済みリストを作成
original_scores = [85, 92, 78, 96, 73]print(f"元の成績: {original_scores}")
sorted_scores = sorted(original_scores)print(f"ソート済みコピー: {sorted_scores}")print(f"元のリスト: {original_scores}") # 変更されない
実行結果はこちらです。
元の成績: [85, 92, 78, 96, 73]
ソート済みコピー: [73, 78, 85, 92, 96]
元のリスト: [85, 92, 78, 96, 73]
カスタムソートもできます。
# 文字列の長さでソートwords = ["Python", "Java", "C", "JavaScript", "Go"]words_by_length = sorted(words, key=len)print(f"文字数順: {words_by_length}")
# 辞書のソートstudents = [ {"名前": "田中", "成績": 85}, {"名前": "佐藤", "成績": 92}, {"名前": "山田", "成績": 78}]
by_score = sorted(students, key=lambda x: x["成績"], reverse=True)print("成績順(高い順):")for student in by_score: print(f" {student['名前']}: {student['成績']}点")
実行結果はこちらです。
文字数順: ['C', 'Go', 'Java', 'Python', 'JavaScript']
成績順(高い順):
佐藤: 92点
田中: 85点
山田: 78点
リスト内包表記
リスト内包表記は、効率的にリストを作成する方法です。
# 基本的なリスト内包表記squares = [x**2 for x in range(1, 11)]print(f"平方数: {squares}")
# 偶数のみ抽出numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]even_numbers = [x for x in numbers if x % 2 == 0]print(f"偶数: {even_numbers}")
# 文字列の大文字変換words = ["python", "java", "javascript", "go"]upper_words = [word.upper() for word in words]print(f"大文字変換: {upper_words}")
実行結果はこちらです。
平方数: [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
偶数: [2, 4, 6, 8, 10]
大文字変換: ['PYTHON', 'JAVA', 'JAVASCRIPT', 'GO']
条件付きリスト内包表記もできます。
# 成績の評価scores = [85, 92, 78, 96, 73, 88, 91, 84, 77, 93]
# 80点以上の成績のみhigh_scores = [score for score in scores if score >= 80]print(f"80点以上: {high_scores}")
# 成績に応じた評価grades = ["A" if score >= 90 else "B" if score >= 80 else "C" for score in scores]print(f"評価: {grades}")
実行結果はこちらです。
80点以上: [85, 92, 96, 88, 91, 84, 93]
評価: ['B', 'A', 'C', 'A', 'C', 'B', 'A', 'B', 'C', 'A']
実践的な活用例
リストを使った実用的なプログラムの例を見てみましょう。
学生管理システム
学生の情報を管理するシステムを作ってみましょう。
# 学生データの初期化students = [ {"ID": "S001", "名前": "田中太郎", "年齢": 20, "成績": [85, 92, 78]}, {"ID": "S002", "名前": "佐藤花子", "年齢": 19, "成績": [90, 88, 94]}, {"ID": "S003", "名前": "山田次郎", "年齢": 21, "成績": [76, 82, 79]}]
def display_students(student_list): """学生一覧を表示""" print("学生一覧:") for student in student_list: avg_score = sum(student["成績"]) / len(student["成績"]) print(f" {student['ID']}: {student['名前']} " f"({student['年齢']}歳) 平均: {avg_score:.1f}点")
def add_student(student_list, id, name, age, scores): """学生を追加""" new_student = { "ID": id, "名前": name, "年齢": age, "成績": scores } student_list.append(new_student) print(f"学生 {name} を追加しました")
# システムの使用例display_students(students)
# 新しい学生を追加add_student(students, "S004", "鈴木美香", 20, [92, 89, 96])
print("追加後:")display_students(students)
実行結果はこちらです。
学生一覧:
S001: 田中太郎 (20歳) 平均: 85.0点
S002: 佐藤花子 (19歳) 平均: 90.7点
S003: 山田次郎 (21歳) 平均: 79.0点
学生 鈴木美香 を追加しました
追加後:
学生一覧:
S001: 田中太郎 (20歳) 平均: 85.0点
S002: 佐藤花子 (19歳) 平均: 90.7点
S003: 山田次郎 (21歳) 平均: 79.0点
S004: 鈴木美香 (20歳) 平均: 92.3点
買い物リスト管理
日常的な買い物リストを管理してみましょう。
# 買い物リストの管理shopping_list = []
def add_item(item_list, item): """アイテムを追加""" if item not in item_list: item_list.append(item) print(f"'{item}' を追加しました") else: print(f"'{item}' は既にリストにあります")
def remove_item(item_list, item): """アイテムを削除""" if item in item_list: item_list.remove(item) print(f"'{item}' を削除しました") else: print(f"'{item}' はリストにありません")
def display_list(item_list): """リストを表示""" if item_list: print("買い物リスト:") for i, item in enumerate(item_list, 1): print(f" {i}. {item}") else: print("買い物リストは空です")
# 使用例add_item(shopping_list, "牛乳")add_item(shopping_list, "パン")add_item(shopping_list, "卵")display_list(shopping_list)
remove_item(shopping_list, "パン")display_list(shopping_list)
実行結果はこちらです。
'牛乳' を追加しました
'パン' を追加しました
'卵' を追加しました
買い物リスト:
1. 牛乳
2. パン
3. 卵
'パン' を削除しました
買い物リスト:
1. 牛乳
2. 卵
まとめ
Pythonリストの基本から応用まで、幅広く学習しました!
今回学んだポイント
基本概念
- リストは複数のデータを順序付きで格納するデータ構造
- インデックスは0から始まる要素の番号
- スライスでリストの一部を取得できる
- 作成後に要素の追加・削除・変更が可能
重要な操作
- 追加操作: append(), insert(), extend()
- 削除操作: remove(), pop(), del文
- 検索操作: in演算子, index(), count()
- 並び替え: sort(), sorted(), reverse()
実践的なパターン
- リスト内包表記による効率的なデータ処理
- 条件付きフィルタリング
- 辞書との組み合わせによる構造化データ管理
リストは、プログラミングで最も頻繁に使用されるデータ構造の一つです。 基本的な操作から高度なテクニックまで使いこなせるようになることで、より効率的で読みやすいプログラムを書けるようになります。
ぜひ今回学んだ知識を活用して、実際のプロジェクトでリストを積極的に使ってみてください。 小さなプログラムから始めて、徐々に複雑なデータ処理に挑戦することで、確実にスキルアップできますよ!