ここんとこダメプログラムへの不平ばっか書いてたけど、今日はほんとに個人的にちょっとだけ困ったことへの「解答」。
つくづく「スキル」てのは出会いだと思うわけよね。課題・問題への出会いが良いエンジニアほど「スキルアップの機会に恵まれる」てことよな。今回のこれな、「困った記憶がない」のか、あるいは無意識に改善を思考から追いやってサボってたのかは今となってはわからない。けれども少なくとも「解」はワタシには未知だった。これが結構面白くてな。
見出しのことを「したい」のではないんよね。発端となる動機は「index メソッドに任意の条件(callable とか key)を渡すようなことをしたいのだが」ということ。こんなことが出来れば良いのにと思ったわけだ:
正しくない python コードであり、動かないよ
1 lst = ["aaa", "ccc", "bxx", "yyy"]
2 lst.pop(lst.index(lambda item: item.endswith("x"))]
「困った記憶がない」ことへの心当たりは結局のところはこれである:
1 lst = ["aaa", "ccc", "bxx", "yyy"]
2 lst = [item for item in lst if not item.endswith("x")]
3 # あるいはもっと上の動かないコードに忠実な読み替えを試みるのであれば
4 poptarget = [item for item in lst if item.endswith("x")][0] # ※
5 lst.pop(lst.index(poptarget))
まさにこの「※」をやりたくて、そして「[0] が気持ち悪いじゃん」てことなわけな。cond が必ず真になるならいいがそうでないなら out of bounds になるでしょ、そりゃいやだわさ。
これの解が見出しの英文を検索キーにググれば出てくるって寸法だ。上の読み替えならこういうことね:
1 lst = ["aaa", "ccc", "bxx", "yyy"]
2 poptarget = next((item for item in lst if item.endswith("x")), None) # nextにlistは渡せないことに注意
3 if poptarget is not None:
4 lst.pop(lst.index(poptarget))
これでインデクスエラーは起こらないし、何より意図がはっきりするであろうよ。
すんげー役に立つのだぜっ、てことなのかどうかは何とも言えんところなのではあるものの、少なくとも「[0] が気持ち悪くてもやもやする」ことはなくなり、精神衛生上とってもよろしい。






