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

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

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

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

Python

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

Q&A

解決済

3回答

8566閲覧

Python:正負の判定の仕方

Ykkykk

総合スコア140

Python 3.x

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

Python

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

0グッド

2クリップ

投稿2018/10/24 01:23

値の正負の判定の仕方を知りたいです。

Python3

1import numpy as np 2 3lst = [1, 3, 2, 5, 6, 8] 4x = [] 5for a, b in zip(lst[:-1], lst[1:]): 6 c = a - b 7 x.appned(c) 8 signs = np.sign(x) 9 indices = np.where(signs[:-1] != signs[1:])[0]

以上のようなリストとfor文があった際に、cの正負が変わる最初のタイミングでループを抜け、別の処理に移るような動きをしたいと思っています。
リストに入っている値があらかじめわかっておらず、cに初めに入ってくる値がマイナスかプラスかわからない状態のときに、どのように計算結果の正負を判定し、正負が反転していた場合にループを抜けることができるのでしょうか?また、その際のループの回数(リストの何番目で変わったのか)を取得することはできるのでしょうか?

上記のようなコードで、正負が反転している個所をリストとして取得することができ、そのリストの最初の値をとればいいとは思うのですが、もう少しすっきりした書き方や考え方はないのでしょうか?
ご教示いただけますと幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答3

0

ベストアンサー

きれいな実装ではないですが、1つの案として聞いていただければ幸いです。

  • 符号が反転するということは初期の符号から変わった時と同義
  • 符号が反転するということはn番目の符号とn+1番目の符号の掛け算が必ず-1になる

のでそれを判定してみました。

その際のループの回数(リストの何番目で変わったのか)を取得することはできるのでしょうか?

上記に関してはenumerateで調べれば幸せになれる気がします。-v-

python

1diff_lst = [x-y for x, y in zip(lst[:-1], lst[1:])] 2base = diff_lst[0] 3for num in diff_lst: 4 if base*num < 0: 5 break 6

投稿2018/10/24 02:29

_TM

総合スコア173

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

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

Ykkykk

2018/10/24 02:40

ご回答いただきありがとうございます。 一番最初の値とかけていって符号が変わったところで正負が反転しているということですよね。 個人的にはこの考え方がわかりやすいです。 ありがとうございます!
_TM

2018/10/24 02:42

楽しいPythonライフを!
guest

0

リストの中で極大、極小を見つける、みたいな感じでしょうか。(勘違いだったらすみません。)
いただいたコードををなるべくなぞると、こんな感じになりました。
ループの回数を知るには、enumerateを使うと便利です。

python

1lst = [1, 3, 2, 5, 6, 8] 2x = None 3for i, (a, b) in enumerate(zip(lst[:-1], lst[1:])): 4 c = a - b # 差分を計算 5 if x is not None and np.sign(c) != np.sign(x): # 直前の符号と比較(2回目以降) 6 break # 2回目以降で符号が変わっていたら、break 7 x = np.sign(c) 8indice = i - 1 # 符号が変わる直前のインデックス

極小か極大を見つけるという感じで書いてみると、配列の3連続した値を用いることにして、以下のようになりました。

python

1def indice(lst): 2 if len(lst) < 2: 3 return -1. # エラー 4 for i,(a,b,c) in enumerate(zip(lst[:-2], lst[1:-1], lst[2:])): 5 if b > max(a,c) or b < min(a,c): 6 return i 7 return -1 # エラー 8indice([1,3,2,5,6,8]) # => 0

コードを短くするなら、numpyの計算を使って、

python

1lst = np.array([1,3,2,5,6,8]) 2signs = np.sign(lst[:-1] - lst[1:]) 3indices = np.where(signs[:-1] != signs[1:])[0][0] # => 0

投稿2018/10/24 02:29

moch

総合スコア122

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

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

Ykkykk

2018/10/24 02:39

ご回答いただきありがとうございます。 極大・極小を見つけたいわけではなく、単純にどこで初めて正負が反転しているのかを知りたい、という感じでした。 詳細にコードまでご提示いただきありがとうございます。 参考にいたします。 ありがとうございます!
guest

0

lstの階差数列をとって階差の正負が反転しているインデックスをとれば良いですか?

Python

1# 階差数列 2x = [a - b for a, b in zip(lst[:-1], lst[1:])] 3 4x # [-2, 1, -3, -1, -2] 5 6index = 0 7for n in x: 8 # 先頭と正負が反転したらループを抜ける 9 if x[0] * n < 0: 10 break 11 index += 1 12 13# 階差数列上のインデックス 14index # 1 15

投稿2018/10/24 02:24

suzu6

総合スコア168

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

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

Ykkykk

2018/10/24 02:37

ご回答いただきありがとうございます。 先頭の値とかけてマイナスになるかどうかで見ていくということですね。 初心者的にはとてもわかりやすいです。 ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問