スライスの使い所

python

昨今、Pythonの人気はすごい。人気の最大の原因が豊富なライブラリーであることは間違いない。人工知能や機械学習をやりたいとなったときに結局そのライブラリーが充実しているPythonがファーストチョイスとなる。ただ、人気の原因はそれだけではない、記述量の少ないシンプルな文法も魅力だ。よほどの大規模プロジェクトでない限りそのシンプル文法は時短につながるであろう。

今回はその魅力的な文法の中でも貢献度の高いスライスにスポットを当てる。

スライスとは

スライスとはなにかしらの要素から一部分をとりだして、新しく要素を作る技術だ。
例えば以下は文字列Helloから2文字目と3文字目を取り出して新しく文字列を作っている。

s1='Hello'
s2=s1[1:3]
print(s2) # el

リストでスライスを行う場合は

l1=[10,20,30,40,50]
l2=l1[1:4]
print(l2) #[20,30,40]

いずれの場合も以下のようにリスト変数[a:b]のようにして扱う。この際indexは0始まりで終了indexは未満であることがポイントだ。

リスト変数[開始index:終了index]

また、以下のような書き方もよく使う

l1=[10,20,30,40,50]
l2=l1[3:]
print(l2) #[40,50]

これはindex3から後ろすべてを表す。反対に

l1=[10,20,30,40,50]
l2=l1[:3]
print(l2) #[10,20,30]

とした場合先頭から3未満、つまり0,1,2のindexがとりだされて10,20,30となる。
また[:]とすることで同じ構成要素の配列を複製することができる。

l1=[10,20,30,40,50]
l2=l1[:]
print(l2) #[10,20,30,40,50]

配列を複製したい場合によく用いられる方法だ。しかもこれは別id が振られるのでこのあと完全に別の配列と扱える(idのコピーではない)

深堀り

基本は理解できたであろうか、ここではもう少し深堀りしてみる。
まずは負の値も使える

l1=[10,20,30,40,50]
l2=l1[-2:]
print(l2) #[40,50]

このようにした場合後ろから2番目の要素から最後までとなる。
またいわゆる添字の範囲外という概念がない。

l1=[10,20,30,40,50]
l2=l1[2:100]
print(l2) #[30,40,50]

99のindexなど当然存在しないが、この場合はエラーにならず普通に存在する範囲で取り出してくれる。この性質はわりと便利に使えるので覚えておいたほうがよい。

step

また引数を3つにすることでrangeのようにステップを設定することができる

l1=[10,20,30,40,50,60,70.80]
l2=l1[1:7:2]
print(l2) #[20,40,60]

またここで負数を指定すると逆順(末尾から先頭にむかって)に取得してくれる。リバースするもっとも単純な記法としてこちらも有用だ。

l1=[10,20,30,40,50,60,70.80]
l2=l1[::-1]
print(l2) #[80,70,60,50,40,30,20,10]

練習問題

スライスの使い方がわかったところでスライスを使うと簡単にとける問題をやってみうよう。

import string
letters=string.ascii_letters

このように書くと
‘abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ’
という文字列がlettersに代入される。ここらへんのPythonが持ってる文字列はこの記事によくまとまっているので参照してもらいたい。

まあ、今回の本題はここではないこの文字列を指定幅で折り返して表示するというものだ。実行例をみよう。

実行例

幅>>5
abcde
fghij
klmno
pqrst
uvwxy
zABCD
EFGHI
JKLMN
OPQRS
TUVWX
YZ
何行目?(1-11)>>2
fghij

指定された幅ですべての文字列を表示し、何行目?>という入力に対して改めてその行だけ出力する処理だ。リストとスライスを使って実現してみてもらいたい

解答例

import string

letters=string.ascii_letters
n=int(input('幅>>'))
"""
for i in range(len(letters)):
    print(letters[i],end='')
    if (i+1) % n ==0:
        print()
print()
"""

"""
for i,c in enumerate(letters):
    print(c,end='')
    if (i+1) % n == 0:
        print()
print()
"""
data=[]
for i in range(0,len(letters),n):
    letter=letters[i:i+n]
    data.append(letter)
    print(letter)

row=int(input(f'何行目?(1-{len(data)})>>'))
print(data[row-1])

コメントアウトしてある部分のようにいろいろな解法が考えれられるがここはスライスを使った方法が一番シンプルだろう。添字をオーバーしても問題がない性質がここでもいかされている。

python
スポンサーリンク
シェアする
mjpurinをフォローする
ジョイタスネット

コメント

タイトルとURLをコピーしました