0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Pythonリスキリング:リスト・集合・イテレータ・ジェネレータ

Last updated at Posted at 2025-08-02

この記事は、エンジニアとしてキャリアチェンジや再学習(リスキリング)を目指す社会人のための Python 基礎学習記録 です。
筆者自身、現場経験はあるものの CS の基礎やアルゴリズム・データ構造の理解が浅く、その土台を作るべく記録していきます。


🎯 目的

  • データ構造(List / Set)の理解
  • イテレータ / ジェネレータの基本理解と活用
  • Python の繰り返し処理を基礎から見直す
  • 基礎的なコードを複数の方法で書き直して構文と概念を定着

🔰 List(リスト)

リストは順序付きの可変データ構造。重複を許す。

fruits = ["apple", "banana", "apple"]
print(fruits[0])  # 出力: apple

🔰 Set(集合)

セットは順序なしかつ重複しないデータ構造。

fruits = ["apple", "banana", "apple"]
unique = set(fruits)
print(unique)  # 出力例: {'banana', 'apple'}

順序は保証されない点に注意。


🔁 リストから重複を除き、元の順序を保持する

✅ 入力と出力の例

words = ["apple", "banana", "apple", "orange", "banana"]
# 出力: ['apple', 'banana', 'orange']

✅ 解法①: for + set

def filter_unique(seq):
    seen = set()
    result = []
    for item in seq:
        if item not in seen:
            seen.add(item)
            result.append(item)
    return result

print(filter_unique(words))

✅ 解法②: リスト内包表記 + 論理演算

def filter_unique(seq):
    seen = set()
    return [x for x in seq if not (x in seen or seen.add(x))]

print(filter_unique(words))

❓ 理解チェック:set([])set() の違い

  • どちらも空集合を生成する(実質同じ)
  • set([]) はリストから生成、set() は空集合を直接生成(好ましい)

🔁 not in seen を別の書き方にできるか?

if item not in seen:
    ...
  • 明示的な代替案は if not (item in seen)。可読性を優先して not in を使うのが一般的。

⚙️ seq ってなに?

  • 通常 sequence(配列的なもの)の略称
  • リストや文字列、タプルなどを指す汎用引数名

❌ 間違った例と修正

def filter_unique(seq):
  seen = set()
  for item in seq:
    if item not in seen:
      result_word.append(item)
      seen.add(item)

result = list(filter_unique(words))

🔻 問題点

  • result_word が定義されていない
  • filter_uniquereturn を持たない

修正後

def filter_unique(seq):
    seen = set()
    result = []
    for item in seq:
        if item not in seen:
            result.append(item)
            seen.add(item)
    return result

result = filter_unique(words)
print(result)

🧠 ローカル変数 vs グローバル変数

x = "global"

def foo():
    x = "local"
    print(x)  # 出力: local

foo()
print(x)  # 出力: global
  • 関数内の変数は ローカル変数
  • 外で定義された変数は グローバル変数

⚙️ ジェネレータと yield の活用

🎯 演習:1〜10 の偶数だけを yield する

def even_numbers():
    for num in range(1, 11):
        if num > 0 and num % 2 == 0:
            yield num

for num in even_numbers():
    print(num)

⚙️ イテレータとは?

nums = [1, 2, 3]
it = iter(nums)

print(next(it))  # 1
print(next(it))  # 2

✅ 定義:

  • next() で1つずつ要素を取り出せるオブジェクト
  • for 文の裏側で使われている

🔢 ビット演算子のまとめ

演算子 名称
& AND 5 & 31
` ` OR
^ XOR 5 ^ 36
~ NOT ~5-6
<< 左シフト 1 << 24
>> 右シフト 4 >> 12

🧪 Day1 総まとめ:演習パターン集

✅ 演習①:リストから重複を除去し順序を保持(2パターン)

入力

words = ["dog", "cat", "dog", "fish"]

出力

["dog", "cat", "fish"]

解法1: for 文

def dedup(seq):
    seen = set()
    result = []
    for item in seq:
        if item not in seen:
            result.append(item)
            seen.add(item)
    return result

解法2: 内包表記

def dedup(seq):
    seen = set()
    return [x for x in seq if not (x in seen or seen.add(x))]

✅ 演習②:ジェネレータで偶数だけ出力

def even_gen():
    for i in range(1, 11):
        if i % 2 == 0:
            yield i

print(list(even_gen()))  # [2, 4, 6, 8, 10]

✅ 演習③:イテレータを手動で使う

nums = iter([10, 20, 30])
print(next(nums))  # 10
print(next(nums))  # 20

✅ まとめ

項目 概要
List 順序あり・重複OK
Set 順序なし・重複NG
イテレータ next() で1つずつ取り出せる
ジェネレータ yield を使ったイテレータ関数
ビット演算子 論理ではなく2進数レベルの演算で使用

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?