macOS 27のSiri AI(β版)に、同じ依頼を日本語と英語で入力して、Pythonの関数を書いてもらいました。日本語では1通り、英語では3通りのコードが返ってきました。返ってきたコードをそのまま載せて、違いを整理します。
前提の環境
- macOS 27.0(Golden Gate)のSiri AI(β版)
- Siriの言語は英語(日本語のままではSiri AIが使えなかったため)
- 依頼は文字入力。日本語で入力しても受け付けてくれます
依頼した文
リストの重複を取り除くPythonの関数を書いて
Write a Python function that removes duplicates from a list.
日本語で頼んだとき
説明文は英語で、関数が1つと使い方の例が返ってきました。
def remove_duplicates(lst):
seen = set()
return [x for x in lst if not (x in seen or seen.add(x))]
# Example usage:
# remove_duplicates([1, 2, 2, 3, 1]) → [1, 2, 3]
英語で頼んだとき
順序を保つ関数に加えて、「Alternative Approaches」の見出しの下に別の書き方が2つ並びました。
def remove_duplicates(input_list):
seen = set()
result = []
for item in input_list:
if item not in seen:
seen.add(item)
result.append(item)
return result
def remove_duplicates_unordered(input_list):
return list(set(input_list))
def remove_duplicates_ordered(input_list):
return list(dict.fromkeys(input_list))
4つの書き方の違い
| 関数 | 元の順序 | 読みやすさ |
|---|---|---|
| 日本語で返った内包表記 | 保つ | 低い(seen.add(x) が None を返すことを利用している) |
英語で返った for 文 |
保つ | 高い |
list(set(...)) |
保たない | 高い |
list(dict.fromkeys(...)) |
保つ(Python 3.7以降) | 高い |
日本語で返った1行は、seen.add(x) が常に None(偽)を返すことを使って、「まだ見ていない要素なら記録して残す」を1行に詰めています。動きは英語版の for 文と同じですが、内包表記の中で副作用を起こしているため、読み手には意図が伝わりにくい書き方です。
list(set(...)) は、数字の小さなリストだと順序が保たれたように見えることがあります。文字列のリストでは、実行するたびに並びが変わることがあります。
remove_duplicates_unordered(["b", "a", "b", "c", "a"])
# 例: ['c', 'a', 'b'](実行ごとに変わることがある)
remove_duplicates_ordered(["b", "a", "b", "c", "a"])
# ['b', 'a', 'c']
どの書き方も、要素がリストのような変更できる型だと TypeError: unhashable type: 'list' で止まります。
どれを使うか
- 順序を保ちたいなら
list(dict.fromkeys(...))。英語で頼んだときの説明も、この書き方を「1行で順序を保てる」と紹介していました - 順序が要らないなら
list(set(...)) - 日本語で返った内包表記は動きますが、あとで読む人のことを考えると、上の2つのどちらかに置き換えるほうが無難です
結果
同じ依頼でも、英語で頼んだほうが書き方の選択肢まで返ってきました。日本語で頼んだときは、説明文も英語のままでした。Siri AIの日本語β版は10月の提供予定と報じられています。
Siri AIに試した依頼10種類の全体は、Zennにまとめています。
https://zenn.dev/menmen_ailab/articles/6f1d50800ed4d8
AIツールを実際に試して、気になったことをここに残しているのでよろしければぜひチェックを。
- 日々の細かいつまずきなど: X @menmen_ailab
- 経緯と考えたことなど: note