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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

358閲覧

Python:ループの回し方がわかりません

Ykkykk

総合スコア140

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/10/26 01:55

編集2018/10/26 04:15

ループの回し方がよくわかりません。

Python3

1lst = [1, 5, 2, 32, 3, 41, 0, 5, 26, 7, 18, 9, 10] 2lst2 = [1 ,-2 ,-3 ,1 ,3 ,4 ,5 ,-6, -7, 8, 9] 3a = 0 4len_lst = len(lst) - 1 5 6print("forの前のa", a) 7for i in lst: 8 c = lst2[a] +lst2[a+1] 9 d = lst2[a] + i 10 print(c, d) 11 while a < len_lst: 12 while lst2[a] * d < 0: 13 a += 1 14 print("最後のa", a)

以上のようなコードを書いたのですが、出力としては、

Python3

1forの前のa 0 26, 2

と表示されたあと処理が動かなくなり、Ctrl+Cで処理を中断しました。

Python3

1^CTraceback (most recent call last): 2 File "loop.py", line 11, in <module> 3 while lst2[a] * d < 0: 4KeyboardInterrupt

エラーメッセージとしては以上の文言が表示されます。
処理としては、インクリメントする変数aを用意し、lst2[a] * d < 0であればaを増やして計算を行い、そうでない場合はaをインクリメントせずに計算を行うということがしたいです。

上記のコードだと、インクリメントしたあとにうまくfor文に戻れていないような気がしています。
どのようにすればfor文に戻って計算することができるのでしょうか?

修正と追記

Python3

1lst = [1, 5, 2, 32, 3, 41, 0, 5, 26, 7, 18, 9, 10] 2lst2 = [1 ,-2 ,-3 ,1 ,3 ,4 ,5 ,-6, -7, 8, 9] 3a = 0 4len_lst = len(lst) - 1 5 6print("forの前のa", a) 7for i in lst: 8 c = lst2[a] +lst2[a+1] 9 d = lst2[a] + i 10 print("for", a) 11 while a < len_lst: 12 while lst2[a] * d < 0: 13 a += 1 14 print("while", a) 15 else: 16 a += 1 17 print("else", a)

以上のようにelseを置くと無限ループを回避することはできているのですが、出力としては、

Python3

1len 10 2forの前 0 3for 0 42 5else 1 6while 2 7while 3 8else 4 9else 5 10else 6 11else 7 12while 8 13while 9 14else 10 15Traceback (most recent call last): 16 File "loop.py", line 9, in <module> 17 c = i + lst2[a] + lst2[a+1] 18IndexError: list index out of range

となっています。これだとfor文の中ではインクリメントされたaが使われていないということだと思うのですが、インクリメントされたaをfor文の中でも使用したいと思っています。

##追記

上記のコードでも、for文の中でインクリメントされたaの値が使用されているということをお教えいただきました。
aがある値の間for文の中の計算を行い、そのたびごとに条件を評価し、条件から外れた場合にはaをインクリメントして再びfor文の計算に戻る、という繰り返しを行いたいのですが、そのためにはwhile文を使わないということでしょうか?

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Meganezaru

2018/10/26 02:04

for文のiがどこにも利用されていないので、やりたい計算の全貌が理解できないかも。二つのリストから、どのような計算をしたいのかがわかると回答しやすいかもしれません。
mather

2018/10/26 02:42

先程見ていた質問内容からコードが変更されていますね。質問したいことに対してまちがった情報を載せていた場合は書き換える必要があると思うのですが、回答を受けてコードを書き換えた場合などは元のコードを書き換えずに追記することをおすすめします。
Ykkykk

2018/10/26 02:50

ご忠告いただきありがとうございます。不慣れなもので大変失礼いたしました。本当に申し訳ありませんでした。
guest

回答1

0

ベストアンサー

python

1while a < len_lst: 2 while lst2[a] * c < 0: 3 a += 1 4 print("最後のa", a)

この部分で、aが1、len_lstが10、lst2[a]が-2、cが-1とします。
そのとき、while a < len_lstは条件が真なのでループに入りますが、
次のwhile lst2[a] * c < 0-2 * (-1) < 0が偽となるのでこのループには入りません。

すると、再び値が変わらぬままwhile a < len_lstに入り、条件が真となりループされ、
次のwhile lst2[a] * c < 0-2 * (-1) < 0が偽となるのでこのループには入りません。

というのが繰り返されているので無限ループとなっています。
何がしたいコードかわからないので、whileをどこに置くかは指摘できませんが、
少なくともwhile lst2[a] * c < 0のループに入らなかったときの対応を
正しく行うことで無限ループにはならなくなるかと思います。


いつの間にか質問文が追記されてたので回答も追記。

これだとfor文の中ではインクリメントされたaが使われていないということだと思うのですが、

いえ、for文の中でもきちんとwhile文でインクリメントされた値が使われています。
ただし、IndexErrorとあるように、aの値が進みすぎているので、
リストの範囲外の要素にアクセスしてしまっている状態です。

Python

1while a < len_lst: 2 while lst2[a] * d < 0: 3 a += 1 4 print("while", a) 5 else: 6 a += 1 7 print("else", a)

for文の1回のループにつき、while a < len_lstのループ内で、
aはlen_lstと同値になるまでループします。
for文の2回目のループに入るときにはalen_lstの値と同じになり、
lst2lstよりも要素数が少ないので、IndexErrorとなります。


さらに回答追加されてたので追記

正直質問者様がどういう処理をしたいのかが伝わっていません。

aがある値の間for文の中の計算を行い

  • 「aがある値の間」とはどの値なのか
  • 「for文の中の計算」とは何の計算なのか

そのたびごとに条件を評価し

  • 「for文の中でaがある間」繰り返すなら、2重ループになり、その中に条件分岐が来るはずです。

条件から外れた場合にはaをインクリメント

  • 現状のコードでは条件が外れる外れないに関わらずインクリメントしてます。

再びfor文の計算に戻る

現状ではwhile文に戻るので、for文に戻るのであればwhile文を抜ける処理が必要です。

while文を使わないということでしょうか?

使い方によります。
まずはどんな処理をしたいのかを明確にし、それに従ってループするのか条件分岐だけなのかを
判断して適切なプログラムを組む必要があります。

投稿2018/10/26 02:31

編集2018/10/26 04:34
dice142

総合スコア5158

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Ykkykk

2018/10/26 02:37

ご回答いただきありがとうございます。無限ループになっているのですね。 else等を使用して無限ループを回避できた場合に、インクリメントされたaを用いてfor文の中の処理に戻るということは可能なのでしょうか?
dice142

2018/10/26 02:40

書き方次第によって可能です。
dice142

2018/10/26 02:42

書き方次第というか単純に回避すればforループからは出ないはずです。
Ykkykk

2018/10/26 02:49

elseを置いてそこでもインクリメントするようにしたところ、一つ目のwhile文の直前でaをプリントすると一回だけ0が表示され、そのあとにelseの中のプリント文が表示されるようになってしまいました。while文の外側ではaがインクリメントされていないように思いますが、いずれにせよ書き方によっては可能ということなのですね。 ありがとうございます。
Ykkykk

2018/10/26 03:55

再度ご回答いただきありがとうございます。 この状態でfor文の中でもインクリメントされた値が使用されているのですね。 aがある値の間、for文の中でlstから値を取り出し計算を行い、whileの条件から外れた場合にaをインクリメントし再びfor文の中の処理を行うというような動きを想定していたのですが、forが一回回る度ごとにaが限界までインクリメントされているのですね。
Ykkykk

2018/10/26 06:28

何度もご回答に追記いただき本当にありがとうございます。 どのような処理を行いたいのかというのはあるのですが、うまく別のコードに置き換えることができませんでした。申し訳ありません。 ご回答いただいた点を参考に検討していきたいと思います。 お手数おかけしてしまい、申し訳ありません。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問