前提・実現したいこと
Pythonのwhileループを使ってリスト中に初めて現れる負の数を見つけ出したいです。(与えられたリスト中の数が全て0以上である場合は0となるようにしたいです。)
発生している問題・エラーメッセージ
無限ループに陥り、うまく検索できませんでした。
該当のソースコード
Python3.6
1def negative(numbers): 2 num = 0 3 4 while numbers: 5 if num < 0: 6 break 7 return num 8 9 10inlist1 = [1, 4, -22, -39, 1, 8, 27, 6, 27, -12] 11a1 = -22 12assert a1 == negative(inlist1)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
条件は満たしていませんが、参考までに。
itertools.dropwhileを用いれば、こんなふうに簡潔に書けます。
Python
1from itertools import dropwhile 2 3inlist1 = [1, 4, -22, -39, 1, 8, 27, 6, 27, -12] 4it = dropwhile(lambda x: x >= 0, inlist1) 5 6print( 7 next(it, 0) 8)
実行結果 Wandbox
plain
1-22
dropwhileはwhileの一種だ!名前にwhileって入ってるもん!と言い張っても面白いかも。
投稿2018/08/31 04:34
総合スコア35660
0
求めたい答えを表示するだけなら以下のようになります.
python
1def negative(numbers): 2 answer = 0 3 4 for num in numbers: 5 if num < 0: 6 answer = num 7 break; 8 print(answer) 9 10 11numbers = [1, 4, -22, -39, 1, 8, 27, 6, 27, -12] 12negative(numbers)
投稿2018/08/31 03:15
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
while numbers:
は真理値判定手続きに基づき、numbers
が空リスト等でない限りwhile True:
と等価になります。詳細は以下のドキュメントを参照してください。
4. 組み込み型 — Python 3.6.5 ドキュメント | 4.1. 真理値判定
そしてそのコードにはnumが更新される部分もないので、当然無限ループになります。
forを使ってください。
python
1def negative(numbers): 2 num = 0 3 4 for num in numbers: 5 if num < 0: 6 break 7 return num 8 9 10inlist1 = [1, 4, -22, -39, 1, 8, 27, 6, 27, -12] 11a1 = -22 12assert a1 == negative(inlist1)
投稿2018/08/31 01:19
総合スコア30933
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/08/31 01:54
2018/08/31 02:11 編集
2018/08/31 02:13
0
ベストアンサー
while を使ったものを2つ、そうでないものを2つ書いてみました。
python3
1def negative(numbers): 2 len_mumbers = len(numbers) 3 idx = 0 4 while idx < len_mumbers: 5 if numbers[idx] < 0: 6 return numbers[idx] 7 idx += 1 8 return 0 9 10def negative_0(numbers): 11 len_numbers = len(numbers) 12 idx = 0 13 while idx < len_numbers and numbers[idx] >= 0: 14 idx += 1 15 return numbers[idx] if idx < len(numbers) else 0 16 17def negative_1(numbers): 18 for n in numbers: 19 if n < 0: 20 return n 21 return 0 22 23def negative_2(numbers): 24 negs = [n for n in numbers if n < 0] 25 negs.append(0) 26 return negs[0] 27 28inlist1 = [1, 4, -22, -39, 1, 8, 27, 6, 27, -12] 29assert -22 == negative(inlist1) 30assert -22 == negative_0(inlist1) 31assert -22 == negative_1(inlist1) 32assert -22 == negative_2(inlist1) 33 34inlist1 = [1, 4, 22, 39, 1, 8, 27, 6, 27, 12] 35assert 0 == negative(inlist1) 36assert 0 == negative_0(inlist1) 37assert 0 == negative_1(inlist1) 38assert 0 == negative_2(inlist1) 39 40inlist1 = [] 41assert 0 == negative(inlist1) 42assert 0 == negative_0(inlist1) 43assert 0 == negative_1(inlist1) 44assert 0 == negative_2(inlist1)
投稿2018/09/02 00:35
編集2018/09/08 10:27総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/08 10:04