あるコードを書いていて、
html_url = "https://example.com/aaa/bbb/db/item/123456/"
url_parts_name = "-".join(html_url.split("/")[-3:-1])
print(url_parts_name)
で、
item-123456
が、表示されました。
でも、わからない。
この[-3:-1]
とはなんぞやと。
勉強中の身のため、公式ドキュメントを参照したいのですが、こういう記号含みの文字列だと、適切な検索ワードもわかりません。
この記事は、その「わからない」を調べた冗長な記録です。
「わたしはこんな思考をして調べている」の記録のようなものですので、ふつうにPythonの困りごとを解決するために、この記事に迷いこんできた方は、他を探しましょう。
筆者の技術レベル
はじめてのプログラミング言語はC言語。今も仕事でC言語。
趣味では、HTML/CSS/JavaScriptのWeb系をふんわりと使っている。
ということで、Pythonは入門したてです。
C言語は教科書から体系的に学びましたが、Pythonは必要なことを必要なときに必要なだけ(言い換えれば行き当たりばったり)式で勉強しているため、わからないことが多いです。
これは、そこから始まる、調査記録です。
はじめに書籍を見る
python array colon
や、なんとなく聞き覚えのあるslice
で検索してみましたが、空振りしたところで、我が家に唯一あるPythonの教本の存在を思い出したため、それを参照しました。
「独習Python」です。
(教本としての善し悪しは知りません。なんとなく他のシリーズにも聞き覚えがあったため、通販で購入しました)
まずは、目次を眺めて、「配列」の項目を探しました。
ここで、Pythonでは「リスト」という用語が使われていることを知ります。
(JavaScriptみたいに、配列の最後の要素にカンマをつけていいことも、ついでに知ります)
ひととおり目を通して、知りたい用法(添え字にマイナスがつくもの)はでてこなかったため、ついでに続く項目で「演算子」を確認し、この項目の範囲での演算子の一覧にはないことを確認しました。
次に、「文字列」の項目を眺め始めます。
文字列も配列もリストも、私の頭の中では似たようなものとして区分しているからです。
ここで、ようやく、「インデックス/スライス構文」という言葉に出会います。
なんとなくこれっぽい。
詳細を読んでいくと、それっぽく納得しました。
つまり、
html_url = "https://example.com/aaa/bbb/db/item/123456/"
url_parts_name = "-".join(html_url.split("/")[-3:-1])
# html_url.split("/") --> ["https:", (略), "db", "item", "123456", ""]
# -4 -3 -2 -1 (0)
# マイナスで現す添え字は上記の境界を示していて、
# html_url.split("/")[-3:-1] --> ["item", "123456"]
こういうことのように考えると、納得できます。
でも、これはあくまで、「文字列」に対するものだからなあ、と考えながら、書籍の続きを読んでいくと、「リスト」にも「スライス構文」があるらしいという記述が、標準ライブラリのシーケンス型のリストの説明にありました。
「標準ライブラリ」「シーケンス型」「スライス構文」「リスト」というワードがひとまず、脳内にインプットされたところで、Pythonの公式ドキュメントへ戻ります。
Pythonの公式ドキュメントへ
ここから、「list」でページ内検索すると、以下がそれっぽくヒットしました。
「シーケンス型」というのはさっき知ったワードです。
ここで出てきた演算の表を見ていくと、ようやくありました。
s[i:j:k] --> s の i から j まで、 k 毎のスライス
さらに、注釈に
i または j が負の数の場合、インデックスはシーケンスの末端からの相対インデックスになります: len(s) + i または len(s) + j が代わりに使われます。 ただし -0 はやはり 0 であることに注意してください。
このように書かれていて、先ほど書籍で確認した構文の理解と一致しました。
なるほど。
ついでに、step(k)のことも知ることができました。
ひとまず、当初の目的が達成できたため、調査はここでストップです。
終わりに
所感は「新しい言語の勉強は体系的にやったほうがよさそう」です。
言葉を知らないと、検索もままなりません。
ドキュメントを確認したくとも、どこの章の、どの項目を読んだらいいかわかりません。
時間がないときや、それよりも開発進めたいときは、ネットでググって出てきたコードを試すので終わってしまうし、それで(当座は)問題ないことが多いのが実際ではあります。
ですが、少しでも知識を増やすために、今後も時間があるときは公式ドキュメントを確認していきたいなと思いました。
以上です。
丸めただけの乾いた綿みたいな文章をここまで読んでいただき、ありがとうございました。