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

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

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

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

Q&A

解決済

3回答

868閲覧

ある条件を除く合計数の求め方

Miyu_Oyama

総合スコア6

Python

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

0グッド

0クリップ

投稿2021/07/24 21:33

python

1def sum13(nums): 2 if not nums: 3 return 0 4 total = 0 5 for i in range(len(nums)): 6 if nums[i] != 13: 7 if nums[i-1] != 13: 8 total += nums[i] 9 else: 10 total += 0 11 12 return total

パラメーターのnumsにいくつかの数字が入るときに合計を求めたいです。
その時、数字が13だった場合は13とその次の数は合計にカウントしないという条件があります。
私がこのプログラムを実行したら下のようなエラーが出ました。

File "C:\Users\Miyu Oyama\CS-1410\cs1410_week01_review\cs1410_week01_review_07\tests\test_problems.py", line 32, in test_04 self.assertEqual(ans, correct_answer, "You returned {0}. You should have returned {1}. Check your logic and try again.".format(ans, correct_answer)) AssertionError: 3 != 4 : You returned 3. You should have returned 4. Check your logic and try again.

このメッセージによるともしnumsパラメーターに[1, 2, 13, 2, 1, 13]の順に数字が入っているときに私のプログラムだと合計が4になるべきなのに3になってしまうといわれました。
何度試しても同じようなエラーが出てしまうのですが、どうして13の前の1がカウントされないというエラーが起こるのか教えてほしいです。
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

このメッセージによるともしnumsパラメーターに[1, 2, 13, 2, 1, 13]の順に数字が入っているときに私のプログラムだと合計が4になるべきなのに3になってしまうといわれました。

nums = [1, 2, 13, 2, 1, 13] のとき、len(nums) は 6。
range(len(nums) は range(6) だから、i は 0~5。

nums[0] は 1 で 13 ではなく、nums[-1] が 13 だから total は 0 のまま。
nums[1] は 2 で 13 ではなく、nums[0] が 13 ではないから total は 2。
nums[2] は 13 で else に行き、total は 2 のまま。
nums[3] は 2 で 13 ではなく、nums[2] が 13 だから total は 2 のまま。
nums[4] は 1 で 13 ではなく、nums[3] が 13 ではないから total は 3。
nums[5] は 13 で else に行き、total は 3 のまま。

追記
なぜ、3 となるかは説明しましたが、条件通りのコードとするには、

Python

1def sum13(nums): 2 if not nums: 3 return 0 4 total = 0 5 for i in range(len(nums)): 6 if nums[i] != 13 and (i == 0 or nums[i-1] != 13): 7 total += nums[i] 8 return total 9 10print(sum13([1, 2, 13, 2, 1, 13]))

条件は、「13ではない、かつ 13の次ではない」であり、
「13の次ではない」は「先頭であるか、または 1つ前が 13ではない」。

追記2
条件は、「13ではない、かつ 1つ前が 13ではない」ですから、
1つ前の値(previous value) を憶えておく変数を用意すると、

Python

1def sum13(nums): 2 if not nums: 3 return 0 4 prev = total = 0 5 for i in range(len(nums)): 6 if nums[i] != 13 and prev != 13: 7 total += nums[i] 8 prev = nums[i] 9 return total 10 11print(sum13([1, 2, 13, 2, 1, 13]))

とにかく、書き方はいくつもあります。

追記3
range も len も [i] による要素アクセスも全部なくせます。

Python

1def sum13(nums): 2 if not nums: 3 return 0 4 prev = total = 0 5 for val in nums: 6 if val != 13 and prev != 13: 7 total += val 8 prev = val 9 return total 10 11print(sum13([1, 2, 13, 2, 1, 13]))

投稿2021/07/24 21:58

編集2021/07/25 04:48
kazuma-s

総合スコア8224

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

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

Miyu_Oyama

2021/07/24 23:54

返信ありがとうございます。 なるほど!!  数え方が1からスタートと0からスタートで違うからエラーになるんですね。 長さを図るときは1からスタートだと覚えたいです! 一つずづどのように私のプログラムが作用するか教えてくださりありがとうございました(*^^*)
Miyu_Oyama

2021/07/25 02:15

ありがとうございます! そういった書き方も出来るんですね。 先頭であるかどうかという区別の仕方勉強になりました✿
Miyu_Oyama

2021/07/25 17:44

すごいですね [i]も省略できるんですね! たくさん例を教えてくれてとってもありがたいです(*・v・*
guest

0

python

1def sum13(nums): 2 if not nums: 3 return 0 4 total = 0 5 for i in range(len(nums)): 6 print('loop',i,'回目') 7 if nums[i] != 13: 8 if nums[i-1] != 13: 9 print('足し算') 10 total += nums[i] 11 else: 12 total += 0 13 14 return total 15 16sum13([1, 2, 13, 2, 1, 13]) 17 18""" 19loop 0 回目 20loop 1 回目 21足し算 22loop 2 回目 23loop 3 回目 24loop 4 回目 25足し算 26loop 5 回目 273 28"""

途中でデバックコードprintを入れてみると動作がこのようになっています。
rangeが0からはじまっているので最初のi-1が判定されていないなど、
動作が規定通りではないですね。

自分だとflag=Falseを用意しておいて、Falseのとき足し算する。Trueになったらflagをfalseにするだけといったロジックにすると思います。

投稿2021/07/24 21:57

toshikawa

総合スコア388

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

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

kazuma-s

2021/07/24 22:08 編集

> rangeが0からはじまっているので最初のi-1が判定されていないなど、 動作が規定通りではないですね。 Python では nums[-1] は最後の要素で 13 なので、判定されています。 動作はコードの通りです。問題の条件通りではないですが。
Miyu_Oyama

2021/07/25 00:03

返信ありがとうございます。 私のコードのどこがダメだったのか試してくださったんですね。 参考になりました。 私の解決した方法は確かにコードが長いのでアドバイスいただいた方法も試してみます。 新しい知識もありがとうございました(^-^)
guest

0

python

1def sum13(nums): 2 if not nums: 3 return 0 4 total = 0 5 for i in range(len(nums)): 6 if nums[i] != 13 and i == 0: 7 total += nums[i] 8 if nums[i] != 13 and i >= 1: 9 if nums[i-1] != 13 and i >= 1: 10 total += nums[i] 11 else: 12 total += 0 13 14 return total 15

アドバイスをいただいたようにiが0の時もうまくカウントできるようにできました。
でもToshikawaさんの方法ではないので、その方法もできたら追加で上げたいです。
ありがとうございました!!

投稿2021/07/25 00:08

Miyu_Oyama

総合スコア6

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問