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

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

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

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

Q&A

解決済

2回答

1357閲覧

日数データにおけるwhile文の変数設定について

trafalbad

総合スコア303

Python

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

0グッド

0クリップ

投稿2017/02/18 14:55

編集2017/02/18 22:30

day msd
1 0
2 10
3 15
4 30
5 60
6 20
7 17
8 15
9 12
10 10
11 5
12 0

上記データにおいてあるmsdの値(例えばmsd[1]のとき値は10)がそれ以降のmsdの値ではじめの値未満(msd[1]に対してはmsd[10]で値が5)になるまでの日数(msd[1]からmsd[10]までの合計10)を出力させたいと思っています。

#追記
0基底で例えばmsd[10]は5です。
・12こ全ての値を対象にして上記の条件を適用して12個のデータを出力したい
そのため
msd[0]の場合は未満の値がないので0を出力。msd[1]の場合は上記の通り10を出力。
msd[2]の場合はmsd[8]の値は12で7を出力(msd[2]からmsd[8]までの7つ)というようにmsd[0〜11]までに対して個別に値を出力させたいです。
求める出力データは
0,10,7,3,1,0,0,0,0,0,0,0
となります。

そこでwhile文を使おうと思うのですが、次のwhile文の4行目のmsdの値をそれ以降の値未満にするための変数設定が上手くいきません
n = msd[0]
n = 0
while(n<13):
msd[n]>msd[n+1] #あるmsdの値がそれ以降の値でそれ未満になるような変数設定
n+=1
break

上記コードの4行目のmsdの条件(あるmsdの値がそれ以降のmsdの値でその値未満になる)を満たすような変数の設定方法を教えてください。

それかwhile文を使わなくても効果的な実装コードがある場合は教えてください。よろしくお願いします

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

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

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

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

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

seastar3

2017/02/19 04:48 編集

添字が0基底か、1基底かが矛盾しています。0基底ならmsd[1]が10でよいが、5の値はmsd[10]に位置します。どちらでしょうか。
seastar3

2017/02/18 18:31

0基底としてmsd[0]の値0がはじめの値とするとそれ未満のデータはありません。0のデータはないものとして、msd[11]の0の値も末尾フラグとしてとらえたらよいのでしょうか。
trafalbad

2017/02/18 22:25

0基底でmsd[10]は5です。修正します。 また12こ全ての値を対象にしているためmsd[0]の場合は未満の値がないので0を出力。msd[1]の場合は上記の通り10を出力。msd[2]の場合はmsd[8]の値は12で7を出力(msd[2]からmsd[8]までの7つ)というようにmsd[0〜11]までに対して個別に値を出力するようにしたいと思っています。
guest

回答2

0

ベストアンサー

各項目ごとに最小値がリセットされるとしたら、次のような形式でしょうか。

python

1n = 12 # 配列の件数 2minimum = -999 3miniindex = 0 # 最小値のある配列の添字 初期値は0番目 4i = 0 # すべての配列データ捜査のための添字 5# 全ての配列データ捜査 6while i < n: 7 minumum = msd[i] # 最小値 毎回初期化する 8 j = i + 1 # i番の後にi番のデータよりも小さなデータがあるかを探査するための添字 9 while msd[j] >= minimum or j < n: 10 j += 1 11 12 if j < n: # jがn未満ならi番のデータより小さい値を見つけたことで、 13 # nならば見つからなかったことになる。 14 kyori = j - i # j番がi番より何個分後にあるかを求める変数 15# i番の後の間近にi番のデータより小さいデータが見つかったときにその情報を表示する。 16 print i+"番のデータ"+msd[i]+"の"+kyori+"番後にもっと小さい"+msd[j]+"があります。" 17 else: 18# 配列データ中にi番のデータ未満の値がなかったとき、 19# i番自身のデータを表示する。 20 print i+"番のデータが最小であり、"+msd[i]+"です。" 21 22 i += 1 23 24

またデータ番号と昇順の順位の項目も用意して、自分より順位の小さいデータが自分以降の間近にあるかを調べ、もしあれば自分のデータ番号とそのデータの番号との差を出力するアルゴリズムも考えられます。

投稿2017/02/19 03:02

編集2017/02/19 04:47
seastar3

総合スコア2285

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

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

trafalbad

2017/02/19 05:07

kyori = j - i の値が2 3 4 5 6 7 8 9 10 0 になってしまいます。これはjがj=i+1という値を固辞しているためではないかと思われるのですが、j をi以降の自分より順位の小さいデータ番号に該当させるためにはどうしたら良いでしょうか?
seastar3

2017/02/19 07:22

最小値のリセットがご希望の仕様とは違っていますかね。 必要な変数とループとif文の構造はお示ししたつもりです。 あとはデバッグ用のprint文を多用しながらトレースし、ループ回数や境界を厳密にしていきましょう。 よいスキルアップになるでしょう。
trafalbad

2017/02/19 08:19

ありがとうございます。やってみます。
guest

0

修正依頼に挙げたように最初の値の定義がよく分からないのですが、未検証のコード例を示せば、
以下のような形式になるでしょう。
ポイントは2重繰り返しで最初のデータより小さいかデータの末尾に達したかを調べて件数を表示するような構造です。
pythonになれていないので、この程度でご勘弁を。

python

1n = 12 # 配列の件数 2minimum = msd[0] # 最小値 初期値は0番目の値 3miniindex = 0 # 最小値のある配列の添字 初期値は0番目 4i = 0 # すべての配列データ捜査のための添字 5# 全ての配列データ捜査 6while(i<n): 7 if msd[i] < minimum: 8 minumum = msd[i] 9 miniindex = i 10 print msd[i] 11 else: 12 j += 1 13# 配列データが最小値でなかったときの最小値までの 14 while msd[j] >= minimum or j < n: 15 j += 1 16 if j < n: 17 minumum = msd[j] 18 miniindex = j 19 print j - i 20 else: 21 print n - i 22 i += 1

投稿2017/02/18 18:57

seastar3

総合スコア2285

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問