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

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

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

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

Python

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

Q&A

解決済

4回答

300閲覧

リストに格納されている0を計算せずに他の値は計算したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2022/07/03 13:29

前提

以下のような二次元リストを作成しました。

python

1x = [[-2, 7, -2], [0, -4, -4], [2, -3, -2], [-3, -4, -4], [-4, 0, -4]]

実現したいこと

これらの数字に+1してその後に3で割り算したいです。しかし、x[1][0]とx[4][2]は0なので計算せず0は0のままにしたいです。
つまり、このような計算手順になります。

①-2を足したとき、

python

1x_1 = [[-4, 5, -4],[0, -6, -6],[0, -5, -4],[-5, -6, -6],[-6, 0, -6]]

②3で割った時、

python

1x_2 = [[-1.33, 1.67, -1.33], [0, -2, -2], [0, -1.67, -1.33], [-1.67, -2, -2], [-2, 0, -2]]

となります。

試したこと

まず、①の計算をする時に、数字が0であった場合は計算しないという風なコードを作ればいいと思ったのでif文を使いたくなりました。

python

1x = [[-2, 7, -2], [0, -4, -4], [2, -3, -2], [-3, -4, -4], [-4, 0, -4]] 2 3for s in x: 4 for x_1 in s: 5 print(x_1)

このようなコードを書くと、リストxに格納されているすべての数字が取り出せます。
続いて、print(x_1 - 2)としたときは、このようになります。

python

1x = [[-2, 7, -2], [0, -4, -4], [2, -3, -2], [-3, -4, -4], [-4, 0, -4]] 2 3for s in x: 4 for x_1 in s: 5 print(x_1 -2) 6#出力結果 7-4 85 9-4 10-2 11-6 12-6 130 14-5 15-4 16-5 17-6 18-6 19-6 20-2 21-6

すべての数字に-2を足した値が出力されました。
続いて、if文でリストxの中身が0だった場合計算しないというコードを作りました。

python

1x = [[-2, 7, -2], [0, -4, -4], [2, -3, -2], [-3, -4, -4], [-4, 0, -4]] 2 3for s in x: 4 for x_1 in s: 5 if x_1 == 0: 6 continue 7 else: 8 print(x_1 -2) 9 10#出力結果 11-4 125 13-4 14-6 15-6 160 17-5 18-4 19-5 20-6 21-6 22-6 23-6

これだと、x_1にはリストxにあった0が格納されていない(スキップされた)ので実現したいことと異なってしまいました。
ここまで、考えてどのようにすれば解決できるのか分からなくなってしまったので質問します。
ここが分かれば3で割った時はprint(x_1 -2)をprint(x_2/3)にすれば値が求められると思います。

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

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

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

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

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

meg_

2022/07/03 13:54

> これだと、x_1にはリストxにあった0が格納されていない(スキップされた) 「x_1には」「リストxにあった0が格納」されているが「スキップ」しているだけですよね?
hoshi-takanori

2022/07/03 18:34

単純に、x_1 が 0 の時にスキップせずに (continue の代わりに)、x_1 をそのまま表示すれば良いような。
guest

回答4

0

ベストアンサー

Numpy を使う場合。

python

1import numpy as np 2from pprint import pprint 3 4x = [[-2, 7, -2], [0, -4, -4], [2, -3, -2], [-3, -4, -4], [-4, 0, -4]] 5 6nx = np.array(x) 7nx[nx != 0] -= 2 8y = (nx / 3.0).round(2).tolist() 9pprint(y) 10 11# 12[[-1.33, 1.67, -1.33], 13 [0.0, -2.0, -2.0], 14 [0.0, -1.67, -1.33], 15 [-1.67, -2.0, -2.0], 16 [-2.0, 0.0, -2.0]]

投稿2022/07/03 13:50

melian

総合スコア19798

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

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

退会済みユーザー

退会済みユーザー

2022/07/04 13:06

ありがとうございます!
guest

0

単純に、 x_1 == 0 のときも print(x1) を入れたらよいかなと思います。
もしくは、

Python

1for s in x: 2 for x_1 in s: 3 print(x1 - 2 if x1 != 0 else 0)

でもよいかなと思います。

ただ、Numpy使えるなら、この回答 がよいかなと思います。

投稿2022/07/03 22:15

ijufumi

総合スコア276

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

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

退会済みユーザー

退会済みユーザー

2022/07/04 13:07

continueにしてるからダメだったんですね、、気づきませんでした。ありがとうございます!
guest

0

これらの数字に+1してその後に3で割り算したいです。しかし、x[1][0]とx[4][2]は0なので計算せず0は0のままにしたいです。

+1 ではなく -2 ですね。x[4][2] ではなく x[4][1] が 0 ですね。

Python

1x = [[-2, 7, -2], [0, -4, -4], [2, -3, -2], [-3, -4, -4], [-4, 0, -4]] 2 3x1 = [[y-2 if y else 0 for y in s] for s in x] 4print(x1) 5 6x2 = [[round(y/3, 2) for y in s] for s in x1] 7print(x2)

小数点以下が 0 の場合、.0 を表示しないようにしたいですか?

投稿2022/07/03 18:28

kazuma-s

総合スコア8224

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

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

0

if文で0のときはprintさえスキップするようになってますね

投稿2022/07/03 13:51

y_waiwai

総合スコア87774

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

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

退会済みユーザー

退会済みユーザー

2022/07/04 13:09

continueのところをprintに変更したらできました。ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問