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

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

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

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Python

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

Q&A

解決済

4回答

1393閲覧

Pythonのwhileを使って、リスト中の負の数の検索を行いたいです。

snowhawk

総合スコア11

Python 3.x

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

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Python

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

0グッド

0クリップ

投稿2018/08/31 01:13

前提・実現したいこと

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ページで確認できます。

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

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

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

guest

回答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

LouiS0616

総合スコア35660

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

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

snowhawk

2018/09/08 10:04

ありがとうございます! dropwhileの話も面白いかもですね。(多分、怒られます。^^;)
guest

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

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

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

snowhawk

2018/09/08 10:04

とても簡潔に教えていただきありがとうございます!
guest

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

hayataka2049

総合スコア30933

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

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

snowhawk

2018/08/31 01:54

やはり、whileではダメでしたか。 whileを使ってでの課題でしたので、何か手段があるかと思ってました。 いずれにせよ迅速に回答いただき、ありがとうございました。
hayataka2049

2018/08/31 02:11 編集

whileを使うなら、まあ普通にやるならインデックスをインクリメントしていってループすれば良いと思います numbers[0],numbers[1],...,numbers[n-1]を順番に見ていくようなループを書ければ、forと同じ機能が作れるでしょう 課題ということなのと、簡単なので、プログラムは示さなくても構いませんよね
snowhawk

2018/08/31 02:13

やってみます! ありがとうございました。
guest

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
katoy

総合スコア22324

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問