Python 3で文字列にインデックスを付けてスライスする方法

前書き

Python文字列データ型は、文字、数字、空白文字、または記号で構成される1つ以上の個々の文字で構成されるシーケンスです。 文字列はシーケンスであるため、他のシーケンスベースのデータ型と同じ方法で、インデックス付けとスライスを通じてアクセスできます。

このチュートリアルでは、インデックスを使用して文字列にアクセスし、文字シーケンスを使用して文字列をスライスし、カウントおよび文字の場所を特定する方法について説明します。

文字列のインデックス方法

インデックス番号に対応する項目を持つlist data typeと同様に、文字列の各文字も、インデックス番号0から始まるインデックス番号に対応します。

文字列Sammy Shark!の場合、インデックスの内訳は次のようになります。

S a m m y S h a r k !

0

1

2

3

4

5

6

7

8

9

10

11

ご覧のとおり、最初のSはインデックス0で始まり、文字列はインデックス11で!記号で終わります。

また、SammySharkの間の空白文字も、それ自体のインデックス番号に対応していることがわかります。 この場合、空白に関連付けられているインデックス番号は5です。

感嘆符(!)にもインデックス番号が関連付けられています。 *#$&.;?などの他の記号や句読点も文字であり、独自のインデックス番号に関連付けられます。

Python文字列の各文字に対応するインデックス番号があるため、他のシーケンシャルデータ型と同じ方法で文字列にアクセスして操作できます。

正のインデックス番号による文字へのアクセス

インデックス番号を参照することにより、文字列内の文字の1つを分離できます。 これを行うには、インデックス番号を角かっこで囲みます。 文字列を宣言して印刷し、角括弧でインデックス番号を呼び出しましょう。

ss = "Sammy Shark!"
print(ss[4])
Outputy

文字列の特定のインデックス番号を参照すると、Pythonはその位置にある文字を返します。 文字yは文字列ss = "Sammy Shark!"のインデックス番号4にあるため、ss[4]を出力すると、出力としてyが返されます。

インデックス番号を使用すると、文字列内の特定の文字にアクセスできます。

負のインデックス番号による文字へのアクセス

長い文字列があり、アイテムを最後に向かって正確に特定したい場合は、インデックス番号-1から始めて、文字列の最後から逆方向にカウントすることもできます。

同じ文字列Sammy Shark!の場合、負のインデックスの内訳は次のようになります。

S a m m y S h a r k !

-12

-11

-10

-9

-8

-7

-6

-5

-4

-3

-2

-1

負のインデックス番号を使用すると、次のように、-3インデックスでの位置を参照して、文字rを出力できます。

print(ss[-3])
Outputr

負のインデックス番号を使用すると、長い文字列の末尾に向かって単一の文字を分離するのに有利です。

文字列のスライス

文字列から一連の文字を呼び出すこともできます。 単語Sharkだけを出力したいとします。 これを行うには、元の文字列内の文字のシーケンスであるsliceを作成します。 スライスを使用すると、コロン[x:y]で区切られたインデックス番号の範囲を作成することにより、複数の文字値を呼び出すことができます。

print(ss[6:11])
OutputShark

[6:11]のようにスライスを作成する場合、最初のインデックス番号はスライスの開始位置(包括的)であり、2番目のインデックス番号はスライスの終了位置(排他的)です。そのため、上記の例では範囲が文字列が終了した直後に発生するインデックス番号になります。

文字列をスライスするときは、substringを作成します。これは、基本的に別の文字列内に存在する文字列です。 ss[6:11]を呼び出すときは、文字列Sammy Shark!内に存在する部分文字列Sharkを呼び出します。

文字列のいずれかの端を含める場合は、string[n:n]構文の数値の1つを省略できます。 たとえば、文字列ssの最初の単語「Sammy」を出力する場合は、次のように入力します。

print(ss[:5])
OutputSammy

これを行うには、スライス構文でコロンの前のインデックス番号を省略し、サブストリングの終わりを参照するコロンの後のインデックス番号のみを含めます。

文字列の途中から始まり、最後まで出力される部分文字列を出力するには、次のようにコロンの前にインデックス番号のみを含めることで実行できます。

print(ss[7:])
Outputhark!

コロンの前にインデックス番号のみを含め、2番目のインデックス番号を構文から除外すると、サブストリングは、呼び出されたインデックス番号の文字から文字列の末尾に移動します。

負のインデックス番号を使用して文字列をスライスすることもできます。 前に説明したように、文字列の負のインデックス番号は-1から始まり、文字列の先頭に到達するまでそこからカウントダウンします。 負のインデックス番号を使用する場合、文字列の最初の方にある小さい番号から始めます。

2つの負のインデックス番号を使用して、文字列ssをスライスしましょう。

print(ss[-4:-1])
Outputark

文字「a」は-4インデックス番号の位置にあり、文字「k」は-1インデックス番号の位置の直前にあるため、部分文字列「ark」は文字列「Sammy Shark!」から印刷されます。

文字列のスライス中にストライドを指定する

文字列スライスでは、2つのインデックス番号に加えて、3番目のパラメーターを使用できます。 3番目のパラメーターは、strideを指定します。これは、文字列から最初の文字が取得された後に前方に移動する文字数を示します。 これまでのところ、strideパラメーターを省略しており、Pythonのデフォルトではストライドが1に設定されているため、2つのインデックス番号の間のすべての文字が取得されます。

部分文字列「Shark」を出力する上記の例をもう一度見てみましょう。

print(ss[6:11])
OutputShark

ストライドが1の3番目のパラメーターを含めることで、同じ結果を取得できます。

print(ss[6:11:1])
OutputShark

したがって、1のストライドは、スライスの2つのインデックス番号の間のすべての文字を取り込みます。 strideパラメータを省略すると、Pythonはデフォルトで1になります。

代わりに、ストライドを増やすと、文字がスキップされることがわかります。

print(ss[0:12:2])
OutputSmySak

Python構文ss[0:12:2]の最後のパラメーターとしてストライド2を指定すると、1文字おきにスキップされます。 赤で印刷されている文字を見てみましょう。

Samm [.highlight]yShar [.highlight]k

インデックス番号5の空白文字もスキップされ、2のストライドが指定されていることに注意してください。

ストライドパラメーターに大きな数値を使用すると、サブストリングが大幅に小さくなります。

print(ss[0:12:4])
OutputSya

Python構文ss[0:12:4]の最後のパラメーターとしてストライド4を指定すると、4文字ごとにのみ出力されます。 繰り返しますが、赤で印刷されている文字を見てみましょう。

Samm [.highlight]y Shark!

この例では、空白文字もスキップされます。

文字列全体を出力しているため、2つのインデックス番号を省略して、構文内に2つのコロンを保持して同じ結果を得ることができます。

print(ss[::4])
OutputSya

2つのインデックス番号を省略してコロンを保持すると、文字列全体が範囲内に維持されますが、ストライドの最後のパラメーターを追加すると、スキップする文字数が指定されます。

さらに、ストライドに負の数値を指定できます。ストライドを-1に設定すると、元の文字列を逆順で印刷するために使用できます。

print(ss[::-1])
Output!krahS ymmaS

パラメーターを指定しない2つのコロンには元の文字列のすべての文字が含まれ、1のストライドにはスキップせずにすべての文字が含まれ、そのストライドを無効にすると文字の順序が逆になります。

再び-2のストライドでこれを実行しましょう。

print(ss[::-2])
Output!rh ma

この例、ss[::-2]では、パラメーターにインデックス番号が含まれていないため、元の文字列全体を処理し、負のストライドを介して文字列を反転しています。 さらに、-2のストライドを使用することにより、逆の文字列の1文字おきをスキップしています。

!krahS[whitespace]ymmaS

この例では、空白文字が印刷されます。

Pythonスライス構文の3番目のパラメーターを指定することにより、元のストリングからプルするサブストリングのストライドを示しています。

カウント方法

文字列内の文字に対応する関連するインデックス番号について考えていますが、文字列をカウントしたりインデックス番号を返すメソッドをいくつか試す価値があります。 これは、ユーザー入力フォーム内で受け入れたい文字数を制限したり、文字列を比較したりするのに役立ちます。 他の順次データ型と同様に、文字列はいくつかの方法でカウントできます。

最初に、文字列、リスト、tuplesdictionariesなど、順序付けされているかどうかに関係なく、シーケンスである任意のデータ型の長さを取得できるlen()メソッドについて説明します。

文字列ssの長さを出力してみましょう。

print(len(ss))
Output12

文字列「Sammy Shark!」の長さは、空白文字と感嘆符記号を含めて12文字です。

変数を使用する代わりに、文字列をlen()メソッドに直接渡すこともできます。

print(len("Let's print the length of this string."))
Output38

len()メソッドは、文字列内の文字の総数をカウントします。

1つの特定の文字または文字のシーケンスが文字列に表示される回数をカウントする場合は、str.count()メソッドを使用してカウントできます。 文字列ss = "Sammy Shark!"を使用して、文字「a」が出現する回数を数えましょう。

print(ss.count("a"))
Output2

別のキャラクターを検索できます:

print(ss.count("s"))
Output0

文字「S」は文字列に含まれていますが、各文字では大文字と小文字が区別されることに注意してください。 大文字と小文字を区別せずに文字列内のすべての文字を検索する場合は、str.lower()メソッドを使用して、最初に文字列をすべて小文字に変換できます。 このメソッドの詳細については、「https://www.digitalocean.com/community/tutorials/an-introduction-to-string-methods-in-python-3#making-strings-upper-and-lower-caseをご覧ください。 [Python 3の文字列メソッドの紹介]。」

文字のシーケンスでstr.count()を試してみましょう。

likes = "Sammy likes to swim in the ocean, likes to spin up servers, and likes to smile."
print(likes.count("likes"))
Output3

文字列likesでは、「いいね」に相当する文字シーケンスが元の文字列に3回出現します。

また、文字列内で文字または文字シーケンスが発生する位置を見つけることもできます。 これはstr.find()メソッドで実行でき、インデックス番号に基づいて文字の位置を返します。

文字列ssの最初の「m」がどこにあるかを確認できます。

print(ss.find("m"))
Ouput2

最初の文字「m」は、文字列「SammyShark!」のインデックス位置2にあります。文字列ssaboveのインデックス番号の位置を確認できます。

文字列likesの最初の「いいね」文字シーケンスがどこにあるかを確認しましょう。

print(likes.find("likes"))
Ouput6

文字シーケンス「likes」の最初のインスタンスは、インデックス番号位置6から始まります。この位置には、シーケンスlikesの文字lが配置されます。

「いいね」の2番目のシーケンスがどこから始まるのかを知りたい場合はどうでしょうか。 これを行うには、特定のインデックス番号で始まるstr.find()メソッドに2番目のパラメーターを渡します。 したがって、文字列の先頭から始める代わりに、インデックス番号9から始めましょう。

print(likes.find("likes", 9))
Output34

インデックス番号9で始まるこの2番目の例では、文字シーケンス「likes」の最初の出現はインデックス番号34で始まります。

さらに、3番目のパラメーターとして範囲の終了を指定できます。 スライスと同様に、負のインデックス番号を使用して逆方向にカウントすることでこれを行うことができます。

print(likes.find("likes", 40, -6))
Output64

この最後の例では、インデックス番号40と-6の間のシーケンス「いいね」の位置を検索します。 入力された最後のパラメータは負の数であるため、元の文字列の末尾からカウントされます。

len()str.count()、およびstr.find()の文字列メソッドを使用して、長さ、文字または文字シーケンスの数、および文字列内の文字または文字シーケンスのインデックス位置を決定できます。

結論

文字列の特定のインデックス番号、または文字列の特定のスライスを呼び出すことができると、このデータ型を使用する際の柔軟性が高まります。 リストやタプルなどの文字列はシーケンスベースのデータ型であるため、インデックス付けとスライスを通じてアクセスできます。

formatting stringsstring methodsの詳細を読んで、文字列の学習を続けることができます。