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

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

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

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

Q&A

解決済

4回答

633閲覧

listの処理,python

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

1クリップ

投稿2021/04/13 06:03

編集2021/04/16 07:05

python

1array = [[228,198,228],[198,198,229],[192,193,191]] 2 3print(array) 4 5 print(array)

実行結果
[[228, 198, 228], [198, 198, 229], [192, 193, 191]]

こういうlist(array)があるとして、この各行の数値の中で、
ある範囲内の数値のlistの個数を返す関数等を作るにはどのようにすれば良いでしょうか(範囲内の数値がなければ0)、
例えば3行目であれば、190以上200以下の間の値は、192 193 191なので、3です。

これ、加えて、
各行の、範囲内数値の個数を全て、listに入れるにはどうすれば良いのでしょうか。
例えばarrayについて、200以上の数値の個数を数える場合であれば、
kosuu[2,1,0]
みたいに出力する方法です。

また、追記ですが、全行の数値の個数の和を求める方法も知りたいです(解決しました)。

あと、更によろしければなのですが、
今各行の内、範囲内にある数字の個数を出力するプログラムを作って頂きましたが、
今度が各列(上下、左から右へ)の内、範囲内にある数字の個数を出力するプログラムは、どのようになるのでしょうか?
numpyだとそのまま、行を上から下へ変換したものになりますよね??

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

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

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

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

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

mather

2021/04/13 06:07

> こういうlist そもそも python のリスト表記になってないので修正しましょう。 また、コードブロックを使って表記してください。 > 例えば4行目であれば、 3行に見えるのですが…
退会済みユーザー

退会済みユーザー

2021/04/13 06:10

訂正、追加しました。
mather

2021/04/13 06:13

Pythonとして実行可能なコードで書いてください。
mather

2021/04/13 06:17

もうひとつ問題設定が曖昧な部分があり、「190〜200の間」としながら 190 は除外しているので「190より大きく、200より小さい」範囲の数ということでしょうか? 細かいところですが正確に記載しましょう。
mather

2021/04/13 06:50 編集

実際にPythonとして実行してみてください。listになってないですよ…。 > 190以上200以下の間の値は、192 193 191なので、3です。 その表現であれば、190を含むので 4 になるはずです。
退会済みユーザー

退会済みユーザー

2021/04/16 07:03

すいません更によろしければなのですが、 今各行の内、範囲内にある数字の個数を出力するプログラムを作って頂きましたが、 今度が各列(上下、左から右へ)の内、範囲内にある数字の個数を出力するプログラムは、どのようになるのでしょうか? numpyだとそのまま、行を上から下へ変換したものになりますよね??
1T2R3M4

2021/04/16 07:11

たまにはご自分で考えたコードを書いてみてはいかがでしょうか。 コピペだけでなくて。
guest

回答4

0

ベストアンサー

numpy使ってるようなので、n行目の範囲を取るのは楽にできます。
例を示しますので、関数化とかはご自分で試してみてください。

python3

1import numpy as np 2arr = np.arange(24).reshape([4, 6]).T 3print(arr) 4# [[ 0 6 12 18] 5# [ 1 7 13 19] 6# [ 2 8 14 20] 7# [ 3 9 15 21] 8# [ 4 10 16 22] 9# [ 5 11 17 23]] 10n = 4 11v_max = 23 12v_min = 10 13print(arr[n][((v_min<arr)&(v_max>arr))[n]]) # [16 22] 14print(len(arr[n][((v_min<arr)&(v_max>arr))[n]])) # 2

投稿2021/04/13 06:58

jeanbiego

総合スコア3966

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

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

退会済みユーザー

退会済みユーザー

2021/04/13 08:26

なるほど。
退会済みユーザー

退会済みユーザー

2021/04/15 09:49 編集

これ、加えて、 各行の、範囲内数値の個数を全て、listに入れるにはどうすれば良いのでしょうか。 例えばarrayについて、200以上の数値の個数を数える場合であれば、 kosuu[2,1,0] みたいに出力する方法です。 ちなみにこのプログラムで実際に、ある行の特定範囲内の数値の抽出と、その個数を求める事ができました。
退会済みユーザー

退会済みユーザー

2021/04/15 14:38

作ってみました。 n, v_max, v_min = 1, 255, 200 imglist = [] lenlist = [] for i in range(79): imglist.append(img_g[i][((v_min<img_g)&(v_max>img_g))[i]]) lenlist.append(len(img_g[i][((v_min<img_g)&(v_max>img_g))[i]])) print(sum(lenlist)) どうでしょう。
jeanbiego

2021/04/15 23:56

img_gというのが検索対象の配列でしょうか。挙動に問題はないように見えます。 あえて改善点をあげるなら、for文は下記のように簡素にすることもできます。(あと、変数nは使ってないので要らないですね) for img in img_g: result = img[(v_min<img)&(v_max>img)] imglist.append(result) lenlist.append(len(result))
退会済みユーザー

退会済みユーザー

2021/04/16 07:03

これを使ってみようと思います、自分のやり方が元なので分かりやすい、ありがとうございます。 すいません更によろしければなのですが、 今各行の内、範囲内にある数字の個数を出力するプログラムを作って頂きましたが、 今度が各列(上下、左から右へ)の内、範囲内にある数字の個数を出力するプログラムは、どのようになるのでしょうか? numpyだとそのまま、行を上から下へ変換したものになりますよね??
jeanbiego

2021/04/16 07:44

new_img_g = img_g.Tとして、転置してやれば同じコードがそのまま使えますよ。
jeanbiego

2021/04/16 07:45

ただ、そろそろ長くなってきたので一旦この質問は閉じていただいたほうが良いですね。 それで別途質問を立てたほうが、回答もつきやすいでしょう。
退会済みユーザー

退会済みユーザー

2021/04/16 08:02

そうか!転置すればいいんですね、なるほど!
退会済みユーザー

退会済みユーザー

2021/04/17 00:41 編集

あれ、この元の教えて頂いたプログラムなんですが、 v_min,v_maxを定義していなくとも、 また、どのような値に定義しても、同じlenlistになるのはなぜでしょう・・・。 あ、print(sum・・・の所も変えないといけないのか。
guest

0

Python

1array = [[228,198,228],[198,198,229],[192,193,191]] 2 3def extract_data(lst, min, max): 4 return [[s for s in ls if min <= s <= max] for ls in lst] 5 6def extract_nums(lst, min, max): 7 return [len([s for s in ls if min <= s <= max]) for ls in lst] 8 9print(extract_data(array, 190, 200)) # [[198], [198, 198], [192, 193, 191]] 10print(extract_nums(array, 190, 200)) # [1, 2, 3]

投稿2021/04/15 12:18

lehshell

総合スコア1147

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

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

退会済みユーザー

退会済みユーザー

2021/04/15 14:55

これって、ようはlistで返してるわけですよね、 あとはこのlistをsumすれば全ての合計値が出せると・・・ 自分の(他の回答者のものを参考に)考えたやつもスマートでした。以下。 n, v_max, v_min = 1, 255, 200 imglist = [] lenlist = [] for i in range(79): imglist.append(img_g[i][((v_min<img_g)&(v_max>img_g))[i]]) lenlist.append(len(img_g[i][((v_min<img_g)&(v_max>img_g))[i]])) print(sum(lenlist))
lehshell

2021/04/16 01:57

質問内容に「合計値」は見つけられません。どこから合計値が出たのでしょうか?
退会済みユーザー

退会済みユーザー

2021/04/16 07:04 編集

すいません追記します。 すいません更によろしければなのですが、 今各行の内、範囲内にある数字の個数を出力するプログラムを作って頂きましたが、 今度が各列(上下、左から右へ)の内、範囲内にある数字の個数を出力するプログラムは、どのようになるのでしょうか? numpyだとそのまま、行を上から下へ変換したものになりますよね??
lehshell

2021/04/16 11:43

質問内容がよくわかりません。具体的な入力例と出力例を示して新しい質問にされるのが良いと思います。
guest

0

python

1array = [[228,198,228],[198,198,229],[192,193,191]] 2 3def count_in_range(nums, minimum, maximum): 4 return len(list(filter(lambda x: x >= minimum and x <= maximum, nums))) 5 6print([count_in_range(row, 190, 200) for row in array])

コードは短いので、filter 関数や内包表記についてはご自身で調べてみると良いと思います。

追記: Python3向けにコードを修正

投稿2021/04/13 08:36

編集2021/04/15 14:40
mather

総合スコア6753

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

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

退会済みユーザー

退会済みユーザー

2021/04/15 05:03

これ、加えて、 各行の、範囲内数値の個数を全て、listに入れるにはどうすれば良いのでしょうか。 例えばarrayについて、200以上の数値の個数を数える場合であれば、 kosuu[2,1,0] みたいに出力する方法です。
mather

2021/04/15 07:12 編集

まずは自分で考えてください。 というか、このコードを実行してみましたか?
退会済みユーザー

退会済みユーザー

2021/04/15 09:50 編集

いえ、これについてはまだ、やってみようかなと思います。 できれば正しいコードを書いて頂いて、それを元に勉強したいと思っているのですが、、和を取る方も。 ちなみにjeanさんに提示いただいたコードで実際に、ある行の特定範囲内の数値の抽出と、その個数を求める事ができました。
mather

2021/04/15 10:42

そうですか。とりあえず試してからコメントしてください。 「正解を教えてもらおう」という行為が teratail では推奨されない質問に当たります。 https://teratail.com/help/question-tips#questionTips1-1 > teratailを「サポートセンター」だとは思わないでください。 > 作業依頼のような投稿をして、課題や仕事を無償でやってもらえる場ではありません。
退会済みユーザー

退会済みユーザー

2021/04/15 13:53

このプログラムをそのまま書くと、 ---> 33 return len(filter(lambda x: x >= minimum and x <= maximum, nums)) 34 35 print([count_in_range(row, 190, 200) for row in array]) TypeError: object of type 'filter' has no len() とエラーが出ました。
mather

2021/04/15 14:40

お使いの環境は Python 3 だったようなのでそれに向けて修正しました。
退会済みユーザー

退会済みユーザー

2021/04/16 07:04 編集

ありがとうございます、すいません更によろしければなのですが、 今各行の内、範囲内にある数字の個数を出力するプログラムを作って頂きましたが、 今度が各列(上下、左から右へ)の内、範囲内にある数字の個数を出力するプログラムは、どのようになるのでしょうか? numpyだとそのまま、行を上から下へ変換したものになりますよね??
mather

2021/04/16 07:07

よろしくないです。 まず、この質問に関して解決できたかどうかを整理してから、改めて別の質問を作ってください。
mather

2021/04/16 07:10

質問の内容そのものをどんどん変更しないでください。回答の内容が質問と合わなくなってしまいます。 質問の編集は間違えていたこと、補足が必要なことなどにしてください。
guest

0

質問修正の内容から、
要件を勘違いしていることに気づきました。
やや工数がかかるものになるので、考え方の提示に止めます。

  • 引数により、最小値と、最大値(範囲)を受け取れるようにする。
  • リストをfor文で走査する。(本要件では、mapメソッドの方が適切かもしれない)
  • ローカル変数にて、range関数をうまく使い、範囲内にいくつ数値が存在するかをカウントする。
  • returnでカウントを返す

------ 以下元回答 ------

python

1def elmCount(array, index): 2 maxSize = len(array) 3 if maxSize > index: 4 return len(array[index]) 5 else: 6 return -1

もっとさっくりいけるかもですが。

投稿2021/04/13 06:12

編集2021/04/13 06:21
miyabi_takatsuk

総合スコア9528

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

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

退会済みユーザー

退会済みユーザー

2021/04/14 07:00 編集

関数だとそんな感じなんですね。 なんとなく、ざっと見て、これが一番、分かりやすい作り方に見えますね。
退会済みユーザー

退会済みユーザー

2021/04/15 05:03

これ、加えて、 各行の、範囲内数値の個数を全て、listに入れるにはどうすれば良いのでしょうか。 例えばarrayについて、200以上の数値の個数を数える場合であれば、 kosuu[2,1,0] みたいに出力する方法です。
miyabi_takatsuk

2021/04/15 05:07

array = [[228,198,228],[198,198,229],[192,193,191]] がなんなのか、 他の回答のfor文やfilter関数が何をしているのか理解すれば、自ずとできるので、 まずは自身でやってみましょう。 でないと、本質問自体も含め、「丸投げ」の域をでないです。
退会済みユーザー

退会済みユーザー

2021/04/15 09:50 編集

array = [[228,198,228],[198,198,229],[192,193,191]]は、 1行目[[228,198,228] 2行目[198,198,229] 3行目[192,193,191]] のlist(というか行列?)です。 できれば正しいコードを書いて頂いて、それを元に勉強したいと思っているのですが、、和を取る方も。 ちなみにjeanさんに書いて頂いたコードで実際に、ある行の特定範囲内の数値の抽出と、その個数を求める事ができました。
miyabi_takatsuk

2021/04/15 10:01

> その個数を求める事ができました であれば、もうすぐですよ。 それをリストに入れて、完成したリストをreturnで返せばいいだけです。 何がわからないのでしょうか??
退会済みユーザー

退会済みユーザー

2021/04/15 14:38

作ってみました n, v_max, v_min = 1, 255, 200 imglist = [] lenlist = [] for i in range(79): imglist.append(img_g[i][((v_min<img_g)&(v_max>img_g))[i]]) lenlist.append(len(img_g[i][((v_min<img_g)&(v_max>img_g))[i]])) print(sum(lenlist)) どうでしょう。 関数ではないのでreturn使ってませんが・・・
miyabi_takatsuk

2021/04/15 15:48

理想の挙動になっていればそれでよいのでは?
退会済みユーザー

退会済みユーザー

2021/04/16 07:03

すいません更によろしければなのですが、 今各行の内、範囲内にある数字の個数を出力するプログラムを作って頂きましたが、 今度が各列(上下、左から右へ)の内、範囲内にある数字の個数を出力するプログラムは、どのようになるのでしょうか? numpyだとそのまま、行を上から下へ変換したものになりますよね??
miyabi_takatsuk

2021/04/16 07:06

聞く前にまずご自分で書いてみてください。 エンジニアは、「まず自分でやってみる」という行動がとても大事になります。
miyabi_takatsuk

2021/04/16 07:07

その上で、どうしてこうなるかわからない、って聞き方にする方がよいかと。 自分でやる前に聞いてしまうと、丸投げになってしまうので。
退会済みユーザー

退会済みユーザー

2021/04/16 08:03

まぁ確かに。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問