Python | データ構造:list

Python
スポンサーリンク

リストの概要(順序がある、後から変えられる「箱」)

Pythonのリストは、複数の値を順序付きで並べて保持できる基本データ構造です。角括弧 [] で作り、整数・文字列・他のリストなど、異なる型を混ぜて入れられます。リストは可変(ミュータブル)なので、後から追加・削除・変更ができます。

empty = []
nums  = [1, 2, 3]
mix   = ["apple", 123, 3.14, True]
print(type(nums))  # <class 'list'>
Python

要素アクセスとスライス(ここが重要)

インデックスで個別取得・更新

インデックスは 0 始まりです。負のインデックスは末尾から数えます。

fruits = ["apple", "banana", "orange"]
print(fruits[0])   # "apple"
print(fruits[-1])  # "orange"
fruits[1] = "grape"
print(fruits)      # ["apple", "grape", "orange"]
Python

スライスで「範囲」や「間引き」

[start:end:step] で部分列を取り出します。end は「含まない」半開区間です。

a = [0, 1, 2, 3, 4, 5]
print(a[1:4])     # [1, 2, 3]
print(a[:3])      # [0, 1, 2]
print(a[::2])     # [0, 2, 4]
print(a[::-1])    # 逆順: [5, 4, 3, 2, 1, 0]
Python

スライス代入で一括更新・挿入・削除

スライス左辺に代入すると、まとめて置換できます。

nums = [1, 2, 3, 4, 5]
nums[1:4] = [20, 30]   # 要素数が変わってもOK
print(nums)            # [1, 20, 30, 5]

nums[2:2] = [99, 100]  # 挿入(空範囲に代入)
print(nums)            # [1, 20, 99, 100, 30, 5]

nums[1:4] = []         # 削除
print(nums)            # [1, 5]
Python

よく使う操作とメソッド(追加・削除・並べ替え)

追加と結合

items = ["a"]
items.append("b")            # 末尾に追加
items.extend(["c", "d"])     # 反復可能オブジェクトを展開して末尾に追加
items.insert(1, "x")         # 位置を指定して挿入
print(items)                 # ["a", "x", "b", "c", "d"]
Python

削除と取り出し

items = ["a", "b", "c", "b"]
items.remove("b")            # 最初の "b" を削除(存在しないと ValueError)
print(items)                 # ["a", "c", "b"]

last = items.pop()           # 末尾を取り出しつつ削除
print(last, items)           # "b" ["a", "c"]

second = items.pop(1)        # 指定位置を取り出し削除
print(second, items)         # "c" ["a"]

items.clear()                # 全削除
print(items)                 # []
Python

並べ替えと逆順

nums = [5, 2, 9, 1]
nums.sort()                  # 就地ソート(破壊的)
print(nums)                  # [1, 2, 5, 9]

nums.sort(reverse=True)      # 降順
print(nums)                  # [9, 5, 2, 1]

words = ["Zoo", "apple", "Banana"]
print(sorted(words, key=str.lower))  # 新しいリストを返す(非破壊)
print(list(reversed(words)))         # 逆順イテレータを展開
Python

イテレーションと作り替え(内包表記・組み合わせ)

ループで処理する

scores = [70, 85, 90]
for s in scores:
    print("score:", s)
Python

enumerate と zip の併用

fruits = ["apple", "banana", "orange"]
for i, f in enumerate(fruits, start=1):
    print(i, f)

names  = ["太郎", "花子"]
points = [92, 88]
for name, point in zip(names, points):
    print(name, point)
Python

リスト内包表記(宣言的に作る)

nums = [1, 2, 3, 4, 5]
sq   = [n*n for n in nums]            # 変換
evens= [n for n in nums if n % 2 == 0]# 条件フィルタ
print(sq, evens)
Python

重要ポイントの深掘り(ミュータブル・コピー・性能)

ミュータブルの性質と“別名参照”に注意

リストは可変です。代入は「別名を作る」だけで、中身を共有します。

a = [1, 2, 3]
b = a              # 同じオブジェクトを参照
b[0] = 99
print(a)           # [99, 2, 3](a も変わる)
Python

「独立したコピー」が欲しいときは浅いコピーを作ります。

a = [1, 2, 3]
b = a[:]                 # スライスで浅いコピー
# b = a.copy()          # 同等
b[0] = 99
print(a, b)              # [1, 2, 3] [99, 2, 3]
Python

入れ子(ネスト)構造では浅いコピーだと内側が共有されます。完全に独立させたいときは deepcopy を使います。

import copy
nested = [[1], [2]]
shallow = nested[:]              # 内側リストは共有
deep    = copy.deepcopy(nested)  # 完全コピー
shallow[0][0] = 99
print(nested)  # [[99], [2]]
print(deep)    # [[1], [2]]
Python

長さ・集計・存在確認の基本関数

nums = [1, 2, 3]
print(len(nums))        # 要素数
print(sum(nums))        # 合計
print(max(nums), min(nums))
print(2 in nums)        # メンバーシップ(存在確認)
Python

大規模処理は“イテレーションを意識”

  • 生成を遅延: 可能ならジェネレータやイテレータで逐次処理(list(…) は必要時のみ)。
  • キー関数: sort/sorted の key を使って O(n log n) を最小化。
  • 前処理分離: 複雑な if を変数へ分解し、ループ本体を短く保つ。

例題で身につける(定番から一歩先まで)

例題1:買い物合計と税計算

orders = [
    {"item": "coffee", "price": 350, "qty": 2},
    {"item": "tea",    "price": 280, "qty": 1},
]
subtotal = 0
for o in orders:
    subtotal += o["price"] * o["qty"]
tax = round(subtotal * 0.1)
total = subtotal + tax
print(f"合計: {total} 円")
Python

例題2:重複除去と並べ替え

items = ["apple", "banana", "apple", "orange", "banana"]
uniq_sorted = sorted(set(items))   # set で重複除去 → sorted で並びを安定化
print(uniq_sorted)                 # ['apple', 'banana', 'orange']
Python

例題3:テーブル整形(幅と寄せ)

rows = [
    ("item", "price", "qty"),
    ("coffee", 350, 2),
    ("tea",    280, 1),
]
for item, price, qty in rows:
    print(f"{item:<10} {price:>6} {qty:>3}")
Python

例題4:二次元リストの転置と合計

matrix = [
    [1, 2, 3],
    [4, 5, 6],
]
cols = list(zip(*matrix))           # 転置(列のタプル)
col_sums = [sum(c) for c in cols]
print(cols, col_sums)               # [(1,4),(2,5),(3,6)] [5,7,9]
Python

落とし穴と対策(初心者がつまずきやすい点)

remove と存在しない値

remove(“x”) は見つからないと ValueError。事前確認: “x” in list で存在チェック、または try/except で安全に。

sort と sorted の違い

sort は就地変更、sorted は新しいリストを返す。方針: 元のデータを残したいときは sorted を使う。

変更しながら回す

ループ対象をその場で削除・追加すると、インデックスがずれます。安全策: コピーで回す(list[:])か、新しいリストへ結果を書き出す。

items = [1, 2, 3, 4]
for x in items[:]:
    if x % 2 == 0:
        items.remove(x)
print(items)  # [1, 3]

まとめ

リストは「順序がある・可変・型を混在できる」柔軟な箱で、Pythonの基礎中の基礎です。インデックスとスライス(半開区間)、メソッド(append/extend/insert/remove/pop/clear/sort)、イテレーション(for・内包表記・enumerate・zip)を押さえ、ミュータブルの性質による別名参照とコピーの違いに注意を払うこと。変更しながら回すときの安全策、sort と sorted の使い分け、set との併用で重複除去などを身につければ、日常のデータ処理を短く、正確に書けるようになります。

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