コラム

【技術情報配信】(続)Python Tips

お疲れ様です。
「AnthropicのClaude Mythosが“強力すぎて一般公開されないAI”」として話題になってましたね。
映画や漫画に出てくるようなSF扱いだった技術が普通にニュースになってることに驚きです。
AIの進化って線形じゃなく指数関数的だと言われますが、さらに折れ曲がって指数の指数みたいな勢いを感じます。
ワクワクもあり怖さもありますね。

さてさて、、
前回はPythonの「enumerate()」についてお話ししましたが、
今回は複数のリストを同時に扱いたいときに重宝する「zip()」を紹介します。

「ユーザー名のリスト」と「スコアのリスト」があって、
それらを組み合わせて出力したい場面ってありますよね。
その際、このような書き方をしてませんか?
[インデックス経由でそれぞれのリストを参照]
names = [“Apollo”, “Bacchus”, “Ceres”, “Diana”]
scores = [85, 50, 78, 90]

for i in range(len(names)):
name = names[i]
score = scores[i]
print(f”{name}: {score}点”)

これでも動きますし、C言語では定番のスタイルですが、
Pythonでは「インデックス管理」「リスト参照」が少し不格好です。
そこで zip() の出番です。
[zip()使用]
names = [“Apollo”, “Bacchus”, “Ceres”, “Diana”]
scores = [85, 50, 78, 90]

# zip() で2つのリストをペアにして同時に取り出す
for name, score in zip(names, scores):
print(f”{name}: {score}点”)

使い方は簡単で、同時に回したいリストを zip() にまとめて渡すだけです。
コードの開始時点で「何と何をペアにしているか」の意図が明確になるといったメリットもありますね。

ちなみに、もし2つのリストの長さが違っていた場合、
zip() は「短い方のリスト」に合わせて自動でループを止めてくれます。

 ※zip()が返すのは「イテレータ」です。
  前回触れませんでしたが、enumerate()も同様です。
言語仕様を活用して、安全スッキリなコードを書いていきましょう。

— おまけ —
zip() は、3つ以上のリストを同時にまとめることも可能です。
また、前回紹介した enumerate() と組み合わせることで、「ペアで取り出しつつ、ループの回数も数える」という書き方もできます。
for i, (name, score) in enumerate(zip(names, scores), start=1):
print(f”{i}人目 – {name}: {score}点”)

zip() には「行列の転置(縦横の入れ替え)」や、辞書(dict)の生成など、まだまだ色々な使い方ができます。
気になった方はぜひ調べてみてください。
 →以前のテトリスコードでイキって使ってます。

組み込み機能を組み合わせることで大概の事は出来るかと思います。
「新たにコード書き起こさない = バグを仕込まない」です。
※ I’m no Python expert, but let’s both do our best to write Pythonic code!
以上。
                                    システムエキスパート職 M.H