0Pricing
DSA Interview Prep · レッスン

リスト、タプル、スライス

典型的なコーディング課題を題材に、Pythonのリスト操作、スライス構文、タプルの不変性を実例で習得します。

「リスト、タプル、スライス」はCoddyKit上の無料DSA Interview Prepレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDSA Interview Prep学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DSA Interview Prepコースには全4レッスンが含まれています。

Pythonのリスト:動的配列

Pythonのlistは、どのような値でも保持でき、自動的に拡張する動的配列です。順序があり、変更可能で、インデックスによるO(1)の即時アクセスができます。コードで基本を示します。

nums = [3, 1, 4, 1, 5]
print(nums[0])   # 3
print(nums[-1])  # 5  (last element)
nums.append(9)
print(len(nums)) # 6

リストの一般的な操作

次のことはしっかり覚えておいてください。末尾でのappendとpopはO(1)ですが、先頭へのinsertはO(n)です。密なループではremoveを避けてください。毎回、全体を再走査するためです。

stack = []
stack.append(1)
stack.append(2)
stack.append(3)
print(stack.pop())   # 3  O(1)
print(stack)         # [1, 2]

# insert at index 0 is O(n)
stack.insert(0, 0)
print(stack)         # [0, 1, 2]

スライス構文の解説

スライスはlst[start:stop:step]と書き、stopの直前で停止します。よく使うテクニックとして、stepを-1にすると、元のリストを変更せずに反転できます。コードでそれぞれの形式を確認します。

a = [0, 1, 2, 3, 4, 5]
print(a[1:4])    # [1, 2, 3]
print(a[:3])     # [0, 1, 2]
print(a[3:])     # [3, 4, 5]
print(a[::2])    # [0, 2, 4]  every other
print(a[::-1])   # [5, 4, 3, 2, 1, 0]  reversed

スライスは浅いコピーを作成する

覚えておくべき注意点があります。スライスは必ず新しいリストを作成します。そのため、スライスを編集しても元のリストはそのままです。ただし浅いコピーなので、内部にあるネストされたリストは共有されたままです。注意してください。

original = [1, 2, 3]
copy = original[:]  # shallow copy
copy[0] = 99
print(original)  # [1, 2, 3]  unchanged

# Nested list pitfall
nested = [[1, 2], [3, 4]]
shallow = nested[:]
shallow[0][0] = 99
print(nested)    # [[99, 2], [3, 4]]  changed!

タプル:イミュータブルなシーケンス

tupleは丸括弧を使い、一度作成すると変更できません。ハッシュ可能なので、dictのキーやsetの要素にできます。グリッド問題の(row, col)の組に最適です。

point = (3, 7)
print(point[0])   # 3

# Use as dict key
grid = {}
grid[(0, 0)] = 'start'
grid[(2, 3)] = 'end'
print(grid[(0, 0)])  # start

# Unpacking
x, y = point
print(x, y)  # 3 7

tupleとlistの使い分け

データを変更しない場合はtupleを、変更する場合はlistを選んでください。tupleはメモリ使用量も少し少ないため、Dijkstraの大きなヒープ内ではその差が積み重なります。

import sys
a_list  = [1, 2, 3, 4, 5]
a_tuple = (1, 2, 3, 4, 5)
print(sys.getsizeof(a_list))   # e.g. 104 bytes
print(sys.getsizeof(a_tuple))  # e.g. 80 bytes

# Tuple returned from function
def min_max(nums):
    return min(nums), max(nums)

lo, hi = min_max([3, 1, 4, 1, 5])
print(lo, hi)  # 1 5

スライスのオフバイワンエラー

オフバイワンバグは、配列問題で最もよくある落とし穴です。lst[i:j]は正確にj-i個の要素を返すことを覚えておいてください。中央で分割する場合、左側はlst[:mid]、右側はlst[mid:]です。

lst = [1, 2, 3, 4, 5, 6]
mid = len(lst) // 2    # 3
left  = lst[:mid]      # [1, 2, 3]
right = lst[mid:]      # [4, 5, 6]
print(left, right)

# How many elements?
print(len(lst[2:5]))   # 3  (indices 2,3,4)

面接での負のインデックス

Pythonには負のインデックスがあります。lst[-1]は最後の要素、lst[-2]はその1つ前の要素です。lst[len(lst)-1]よりもlst[-1]を使ってください。より簡潔な書き方なので、面接官も注目します。

s = 'abcde'
print(s[-1])    # 'e'
print(s[-3:])   # 'cde'
print(s[:-2])   # 'abc'  (all except last 2)

nums = [10, 20, 30, 40]
print(nums[-2])   # 30
nums[-1] = 99
print(nums)       # [10, 20, 30, 99]

リストのソートと比較

PythonのソートにはTimsort(O(n log n)、安定ソート)が使われます。lst.sort()はリストをインプレースで変更し、sorted(lst)は新しいリストを返します。独自の順序にはkeyオプションを使ってください。コードで確認します。

words = ['banana', 'fig', 'apple', 'kiwi']
words.sort(key=len)
print(words)  # ['fig', 'kiwi', 'apple', 'banana']

nums = [3, 1, 4, 1, 5]
print(sorted(nums, reverse=True))  # [5, 4, 3, 1, 1]
print(nums)  # unchanged: [3, 1, 4, 1, 5]

反復中のリストの変更

典型的な落とし穴です。リストをループしている間は、要素を追加したり削除したりしないでください。要素を飛ばしたり、クラッシュしたりします。代わりに内包表記で新しいリストを作成してください。

# WRONG — skips elements
nums = [1, 2, 3, 4, 5]
for n in nums:
    if n % 2 == 0:
        nums.remove(n)  # skips 4!
print(nums)  # [1, 3, 5]... but 4 got skipped? Actually removes 2,4

# CORRECT — build new list
nums = [1, 2, 3, 4, 5]
nums = [n for n in nums if n % 2 != 0]
print(nums)  # [1, 3, 5]

ループでのタプルアンパック

タプルアンパックを使うと、ループをすっきり書けます。enumerateは(index, value)を返し、zipは2つのリストを同時に走査します。*rest構文を使うと、残りの要素を独自の変数にまとめられます。コードで確認します。

nums = [10, 20, 30]
for i, v in enumerate(nums):
    print(i, v)
# 0 10 / 1 20 / 2 30

a = [1, 2, 3]
b = ['x', 'y', 'z']
for x, y in zip(a, b):
    print(x, y)

first, *rest = [1, 2, 3, 4]
print(first, rest)  # 1 [2, 3, 4]

理解度チェック

理解度を簡単に確認しましょう。Pythonのlist、tuple、スライスについて、身に付けたことを示してください。大丈夫です。💪

レッスンのまとめ

まとめ:listはappendがO(1)の動的配列で、スライスは必ず新しいコピーを返し、tupleはイミュータブルでハッシュ可能です。次は辞書と集合を学びます。

よくある質問

「リスト、タプル、スライス」レッスンは無料ですか?

はい。「リスト、タプル、スライス」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DSA Interview Prepコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DSA Interview Prepコースには全4レッスンが含まれています。

「リスト、タプル、スライス」で何を学びますか?

典型的なコーディング課題を題材に、Pythonのリスト操作、スライス構文、タプルの不変性を実例で習得します。 ブラウザで直接実行するハンズオンコードでDSA Interview Prepを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

DSA Interview Prepを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのDSA Interview Prepは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「リスト、タプル、スライス」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このDSA Interview Prepレッスンでコードを書いて実行できますか?

はい。すべてのDSA Interview Prepレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. リスト、タプル、スライス
  2. Pythonの辞書と集合
  3. 内包表記と組み込み関数
  4. 関数、クロージャ、ラムダ
← DSA Interview Prepに戻る