質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

for文でのスライスについて

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 694
退会済みユーザー

退会済みユーザー

for文で、スライスを用いて、strの文字列から、1回目で先頭のPから最後のSまで10個、2回目で2番目のPから最後のSまで9個、のように取得したいのですが、以下のコードの何が悪いのかがわかりません。ご回答お願いします。
問題点は、paramateの変数を更新したいのも関わらず、更新することができずにいる点です。

これでできるのでは?と考えたコード
str = "PPPPWWWWSS"
for i in range (2):
    paramate = 0
    for i in str[paramate:10]:
        print(i)
        paramate += 1
実行結果

P
P
P
P
W
W
W
W
S
S
P
P
P
P
W
W
W
W
S
S
↑一回目も二回目も、10個の文字を取り出してしまっている。これが問題点。

上記のコードでできるのでは??と思った経緯
str = "PPPPWWWWSS"
paramate = 0
for i in str[paramate:10]:
    print(i)
実行結果1(paramate=0の時)

P
P
P
P
W
W
W
W
S
S

str = "PPPPWWWWSS"
paramate = 1
for i in str[paramate:10]:
    print(i)
実行結果2(paramate=1の時)

P
P
P
W
W
W
W
S
S

下の二つのコードでは、paramateの値が更新可能であるため、一番上のコードでもこれが可能であると考えています。
何が問題なのでしょうか???ご指摘お願いします。

LouiS0616さんのアドバイスによる変更点

ご指摘に従ってparamateをループの外に出してみました。しかし、意図した動きになりません、、ここに何を足せば良いのでしょうか??

str = "PPPPWWWWSS"
paramate = 0
for i in range (2):
    for i in str[paramate:10]:
        print(i)
        paramate += 1
実行結果

P
P
P
P
W
W
W
W
S
S
↑一回目のループしかできていない?状態っぽいのですが、、

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • YouheiSakurai

    2019/01/15 21:30

    おめでとうございます。解決に至ってよかったですね。あと、今後のためにあえて一つ書きます。「実行結果(現状の上手くいかない結果)」に「期待する結果(本当ならこうなってほしいという結果)」を併記すると、人にもっと伝わりやすくなりますし、自分の思考の整理にもなりますので、そこをオススメしたいです。実行した結果と期待する結果を適切に説明・記述できるか否かは職業人として本当に大きな分かれ目になると私は考えています。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2019/01/15 21:37

    @YouheiSakuraiさん、貴重な指摘をありがとうございます。
    自分も昨日の質問内容を見返し、相手に伝わりにくいという点で良くなかったと反省しました。現在、学生でプログラマを目指しているので、今回のSakuraiさんの指摘は肝に命じて生きていこうと思います。今後もterateilを積極的に使っていこうと思っています。自分の動向を温かく見守っていただき、ありがとうございました。

    キャンセル

回答 3

checkベストアンサー

+1

こういうことです?

src = "PPPPWWWWSS"

for i in range (2):
    print('-' * 20)

    for j in src[i:]:
        print(j)

実行結果 Wandbox

--------------------
P
P
P
P
W
W
W
W
S
S
--------------------
P
P
P
W
W
W
W
S
S

paramateの値が更新可能であるため、一番上のコードでもこれが可能であると考えています。paramateの値が更新可能であるため、一番上のコードでもこれが可能であると考えています。

『上のコード』では paramate = 0 をループ内に置いているのが問題です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/15 20:55 編集

    昨日に引き続き、お世話になっております。早いレスポンスありがとうございます。
    アドバイスに従って、paramateeをループの外に出したものを編集して載せました。
    しかし、今度は1回目のループの結果のみ表示されるようになってしまい、2回目の繰り返しが存在しません。どう変更したら良いでしょうか??

    キャンセル

  • 2019/01/15 21:10

    paramate += 1 の階層を一つ浅く、つまりは外側のループの要素とすべきでは。

    キャンセル

  • 2019/01/15 21:20 編集

    うわ!!!!できました!!!
    ありがとうございます!!!
    いつもいつも、素早く対応していただいて本当にありがとうございます。
    これからは相手にわかりやすく、質問内容を明確にして生きたいと思います。
    ありがとうございました。

    キャンセル

  • 2019/01/15 21:57

    今回の質問は、どのような実行結果を期待しているかはっきりしていたので回答しやすかったですね。

    ・大目的
    ・小目的
    ・期待する入出力
    ・現状のコード (できるだけ小規模で、現状のエラー以外の問題が無いことが望ましい)
    ・調査したこと
    などが書いてあるとGoodです。

    キャンセル

0

次のコードと実行結果を調査してみてください。
slide.py

str = "PPPPWWWWSS"
for i in range(len(str)):
    for x in str[i:10]:
        print(x, end="")
    print( )

実行結果
イメージ説明

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/01/17 19:53

    こういうやり方もあるんですね!!勉強になります!!

    キャンセル

0

一応、解決したコードを記載しておきます。自分と同じ悩みを持っている方の参考になれば幸いです!!

str = "PPPPWWWWSS"
for i in range (2):
    paramate = 0
    for i in str[paramate:10]:
        print(i)
    paramate += 1


paramateの値を、最初のfor文の部分に書くべきでした。こうすることで、for文のループ終了と共に、paramateの値更新ができるようになりました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る