1. okkn

    Posted

    okkn
Changes in title
+[python] スライスでリバース!!
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,101 @@
+スライスに関して自分の中では新しい発見だったので備忘録。
+基本はいいよって人は半分くらいスキップ!
+
+##スライスの基本の基本の基本!!
+皆さんもリスト型やら文字列から要素を取り出す際にスライスして取り出すこともあると思います。
+スライス?なにそれ?おいしいの?っていう人のためにもさらっと使い方を書き出してみましょう。
+###その零
+スライスじゃないですね(;^ω^)
+
+```py
+a = [1, 2, 3, 4, 5, 6, 7, 8, 9] #2系でも3系でも問題ないようにrangeは敢えて使いません
+a[2] #3
+```
+
+###その一
+普通にスライス。
+
+```py
+# n番目からm-1番目の要素を取り出す
+a[1:4] #[2, 3, 4]
+# 始点を省略すると0番目から
+a[:3] #[1, 2, 3]
+# 終点を省略すると最後まで
+a[7:] #[8, 9]
+```
+
+###そのニ
+負の数にすると後ろから数えてくれる。
+
+```py
+# -1で一番最後
+a[-1] #9
+# ひねくれ者かな?
+a[-8:-5] #[2, 3, 4] (使わない)
+# 始点省略
+a[:-6] #[1, 2, 3] (ほぼ使わない)
+# 終点省略
+a[-2:] #[8, 9] (拡張子の取り出しなどよく使う)
+```
+
+スライスの概念を一番わかりやすく解説しているのはやはり[PythonWeb](http://www.pythonweb.jp/tutorial/string/index11.html)ですね。
+
+##一歩踏み込んでスライス!
+前提として一歩踏み込んだスライスの使い方を紹介!
+知らない人は意外といるかも?
+ここからは私は知りませんでした。
+###ステップスライス(勝手に名づけた)
+本当の名前があるのならば教えていただければ幸いです。
+
+```py
+# コロンを2個続けるとステップして抜き出します
+a[::3] #[1, 4, 7]
+# もちろん切り出しつつのステップも可能
+a[2:7:3] #[3, 6]
+# 負の数を使って後ろから
+a[::-3] #[9, 6, 3]
+# ややこしい・・・orz
+a[-2:-8:-3] # [8, 5]
+# コロンが2個あって且つ後ろからステップする場合は逆順にしてから抜き出してるっぽい
+# よって以下は何も取り出せない
+a[-8:-2:-3] # []
+
+# cf. a[-8:-2] -> [2, 3, 4, 5, 6, 7]
+```
+
+##お待ちかね!スライスでリバース!!
+一応経緯。
+どうでもいいが[ここ](http://news.nicovideo.jp/watch/nw1583728?ver=video_q)を見てpython使ったらこの文字列の作成とか反対から読む文章の作成とか楽勝だろと思い3分クッキングの感覚で入力。
+(画像の**!すまし錨抜 アュギィフムアミレプ ぜかまし×たなこ**の話)
+
+```py
+from __future__ import print_function
+
+konata = 'こなた×しまかぜ プレミアムフィギュア 抜錨します!'
+print(''.join(reversed(konata)))
+# !すまし錨抜 アュギィフムアミレプ ぜかまし×たなこ
+```
+
+でも残念ながらこの方法は一度```reversed(konata)```の部分でオブジェクトを生成しちゃってますのでなんか気に入りません。
+もっとスマートに!!
+と思い色々探していたらありました!!
+おなじみ、stack overflow
+[Best way to create a “reversed” list in Python?](http://stackoverflow.com/questions/3705670/best-way-to-create-a-reversed-list-in-python)
+
+上から順に読んできた方はもうお気づきですね。
+以下になります。
+
+```py
+print(konata[::-1])
+# 変態記法:print(konata[-1:0 - len(konata):-1])
+# !すまし錨抜 アュギィフムアミレプ ぜかまし×たなこ
+```
+
+**Very very very very SMART!!**
+興奮しすぎですね。
+しかも上記リンクを読んだらわかるとおり速いらしいです。(私は未検証)
+そういう点においても**SMART**ですね。
+
+
+##まとめ
+**逆順にしたけりゃ```[リストor文字列][::-1]```にしとけ!!**