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

提供:Dev Guides
移動先:案内検索

###序章

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

このチュートリアルでは、インデックス作成による文字列へのアクセス、文字シーケンスによる文字列のスライス、およびいくつかのカウント方法と文字位置の方法について説明します。

前提条件

Python 3をインストールし、コンピューターまたはサーバーにプログラミング環境をセットアップする必要があります。 プログラミング環境をセットアップしていない場合は、ローカルプログラミング環境またはサーバー上のプログラミング環境のインストールおよびセットアップガイドを参照して、オペレーティングに適したものにすることができます。システム(Ubuntu、CentOS、Debianなど)

    1. 文字列のインデックス付け方法

インデックス番号に対応する項目を持つlistデータ型と同様に、文字列の各文字もインデックス番号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. 正のインデックス番号による文字へのアクセス

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

情報:このチュートリアルのサンプルコードに従うには、python3コマンドを実行して、ローカルシステムでPythonインタラクティブシェルを開きます。 次に、>>>プロンプトの後に例を追加して、例をコピー、貼り付け、または編集できます。


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

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

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

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

長い文字列があり、最後に向かってアイテムを特定したい場合は、インデックス番号-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

負のインデックス番号を使用すると、長い文字列の終わりに向かって1文字を分離するのに有利な場合があります。

    1. スライス文字列

文字列から文字の範囲を呼び出すこともできます。 Sharkという単語だけを印刷したいとします。 これを行うには、元の文字列内の文字のシーケンスであるスライスを作成します。 スライスを使用すると、コロン[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

サブストリング「ark」は、ストリング「SammyShark!」から印刷されます。 文字「a」は-4インデックス番号の位置にあり、文字「k」は-1インデックス番号の位置の前にあるためです。

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

文字列のスライスでは、2つのインデックス番号に加えて3番目のパラメータを受け入れることができます。 3番目のパラメーターは、 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文字おきにスキップされます。 強調表示されている文字を確認してみましょう。

S a m m y S h a r k

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

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

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

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

S amm y Sh a rk!

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

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

print(ss[::4])
OutputSya

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

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

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

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

これをもう一度やりましょう。ただし、ストライドは-2です。

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

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

k r a h S[空白]y m m a S

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

Pythonスライス構文の3番目のパラメーターを指定することにより、元の文字列からプルする部分文字列のストライドを示します。

    1. カウント方法

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

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

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

print(len(ss))
Output12

弦の長さ「サミーシャーク!」 空白文字と感嘆符記号を含む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()メソッドを使用して、最初に文字列をすべて小文字に変換できます。 このメソッドの詳細については、「 Python3の文字列メソッドの概要」を参照してください。

文字のシーケンスで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」の最初のインスタンスは、シーケンスlikesの文字lが配置されているインデックス番号位置6から始まります。

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

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

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

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

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

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

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

##結論

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

文字列のフォーマットおよび文字列メソッドの詳細を読んで、文字列の学習を続けることができます。