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

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

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

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

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

Q&A

7回答

1565閲覧

Pythonリストに0が含まれる場合、0を無視して掛け算をする

yncam

総合スコア0

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

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

2グッド

1クリップ

投稿2021/01/03 23:37

独学でPythonを学び始めた初心者です。
基本的なことで誠に恐縮ですが、お知恵を拝借できますと幸いです。

ゴール:
リストの0以外のすべての数字の乗算を計算する。
もし0が含まれる場合は無視し、0以外の数字を乗ずる。

期待する計算結果:
my_prod_nz([]) returns 1
my_prod_nz([0]) returns 1
my_prod_nz([1,2]) returns 2
my_prod_nz([1,2,3]) returns 6
my_prod_nz([1,2,0,3]) returns 6

if関数を使えば計算可能かと思料しますが、式が分からず苦戦しております。
恐れ入りますがご教示いただけますと幸いです。

seastar3, A_kirisaki👍を押しています

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

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

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

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

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

Zuishin

2021/01/03 23:39

0 を取り除いたリストに変換すればいいと思います。
quickquip

2021/01/04 00:10 編集

0が入ってない前提ならコードがかけるんでしょうか? "ここまでならできる"コードを書く方が回答しやすいですよ
yncam

2021/01/04 00:34 編集

ご助言ありがとうございます。また、失礼いたしました。正しくありませんが、以下のコードを書いておりました。removeの部分が正しくないというエラーがたっておりますので、今一度改善策を考えます。 def my_prod_nz(ls): s = 1 if 0 in ls: my_prod_nz.remove(0) for x in ls: s = s * x return s else: for x in ls: s = s * x return s my_prod_nz([1,2,0,3])
guest

回答7

0

numpyを使うと簡単

pip install numpy==1.19.3

Python

1import numpy as np 2 3def my_prod_nz(lst): 4 arr = np.array(lst) 5 arr = arr[arr != 0] # 0を排除 6 val = int(np.prod(arr)) # 総積を求める(空なら1) 7 return val 8 9my_prod_nz([0]) 10# 1 11my_prod_nz([]) 12# 1 13my_prod_nz([1, 0, 5, 6]) 14# 30

投稿2021/01/04 00:25

編集2021/01/04 00:56
ForestSeo

総合スコア2720

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

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

yncam

2021/01/04 00:37

ご親切にアドバイスありがとうございます。恥ずかしながらnumpyを存じ上げませんでしたので精進いたします。
guest

0

こんなのでどうでしょうか?
リストの0と''を1で置換して、順番に掛け算してるだけです。

python

1a1 = [] 2a2 = [0] 3a3 = [1,2] 4a4 = [1,2,3] 5a5 = [1,2,0,3] 6 7def my_prod_nz(a): 8 non_zero = [1 if i == 0 or i == '' else i for i in a] 9 val = 1 10 for i in non_zero: 11 val *= i 12 13 return val 14 15 16print(my_prod_nz(a1)) 17print(my_prod_nz(a2)) 18print(my_prod_nz(a3)) 19print(my_prod_nz(a4)) 20print(my_prod_nz(a5))

投稿2021/01/04 00:13

Takudom

総合スコア9

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

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

yncam

2021/01/04 00:36

ご丁寧にありがとうございます。いただいた回答を確認し、理解を深めてまいります。お手数おかけしました。
guest

0

再帰という手法も覚えておいてください。

python

1def my_prod_nz(x): 2 if x == []: 3 return 1 4 elif x[-1] != 0: 5 return my_prod_nz(x[:-1]) * x[-1] 6 else: 7 return my_prod_nz(x[:-1])

実行結果は以下です。

python

1>>> print(my_prod_nz([])) 21 3>>> print(my_prod_nz([0])) 41 5>>> print(my_prod_nz([1,2])) 62 7>>> print(my_prod_nz([1,2,3])) 86 9>>> print(my_prod_nz([1,2,0,3])) 106

投稿2021/01/04 13:38

ppaul

総合スコア24666

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

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

0

累積処理は reduce を使うと書きやすい。

Python

1from functools import reduce 2 3a1 = [] 4a2 = [0] 5a3 = [1,2] 6a4 = [1,2,3] 7a5 = [1,2,0,3] 8 9def my_prod_nz(lst): 10 return reduce(lambda x, y: (x if x else 1) * (y if y else 1), lst, 1) 11 12print(my_prod_nz(a1)) # 1 13print(my_prod_nz(a2)) # 1 14print(my_prod_nz(a3)) # 2 15print(my_prod_nz(a4)) # 6 16print(my_prod_nz(a5)) # 6

投稿2021/01/04 02:25

lehshell

総合スコア1147

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

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

0

参考情報

  • Multiply all numbers in the list (4 different ways)

https://makecode.microbit.org/_FarCXKhYYe37

まず最初に list の要素をすべて掛け算する方法を研究してください。

次に 0 を掛け算しない方法を考えてみてください。
list 中の 0 を 1 にする
list 中の 0 を取り除いてから掛け算する
掛け算の処理の中で、 0ならスキップする という条件分岐を組み込む
、、、

投稿2021/01/05 15:02

katoy

総合スコア22324

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

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

0

質問者のプログラムを添削すると、removeする対象は関数my_prod_nzじゃ無くて引き数lsなので、

Python

1def my_prod_nz(ls): 2 s = 1 3 if 0 in ls: 4 ls.remove(0) 5 for x in ls: 6 s = s * x 7 return s 8 else: 9 for x in ls: 10 s = s * x 11 return s

引き数オブジェクトを破壊してしまって良いのかという問題はありますが。

ただし、removeは最初の0しか削除しないので、0が複数あると駄目です。
0がある限り削除し続けると言うことで、

Python

1def my_prod_nz(ls): 2 s = 1 3 while 0 in ls: 4 ls.remove(0) 5 for x in ls: 6 s = s * x 7 return s

でしょうか。

投稿2021/01/04 12:24

otn

総合スコア84555

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

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

0

謎のクラスを作ってみる。

Python

1class I(int): 2 def __mul__(self, other): 3 x = 1 if self == 0 else self.__int__() 4 y = 1 if other == 0 else other.__int__() 5 return I(x * y)

Python

1>>> I(1) * I(2) 22 3>>> I(1) * I(0) * I(3) 43 5>>> x = [I(n if n % 2 == 0 else 0) for n in range (10)] 6>>> x 7[0, 0, 2, 0, 4, 0, 6, 0, 8, 0] 8>>> import functools 9>>> functools.reduce(lambda x, y: x * y, x) 10384

投稿2021/01/04 05:04

A_kirisaki

総合スコア2853

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問