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

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

ただいまの
回答率

90.34%

  • Python

    9289questions

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

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

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 499

trafalbad

score 195

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文を使わなくても効果的な実装コードがある場合は教えてください。よろしくお願いします

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • seastar3

    2017/02/19 02:58 編集

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

    キャンセル

  • seastar3

    2017/02/19 03:31

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

    キャンセル

  • trafalbad

    2017/02/19 07: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]までに対して個別に値を出力するようにしたいと思っています。

    キャンセル

回答 2

checkベストアンサー

0

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

n = 12               # 配列の件数
minimum = -999
miniindex = 0        # 最小値のある配列の添字 初期値は0番目
i = 0                # すべての配列データ捜査のための添字
# 全ての配列データ捜査
while i < n:
    minumum = msd[i] # 最小値 毎回初期化する
    j = i + 1        # i番の後にi番のデータよりも小さなデータがあるかを探査するための添字
    while msd[j] >= minimum  or j < n:
      j += 1

  if j < n:         # jがn未満ならi番のデータより小さい値を見つけたことで、
                     # nならば見つからなかったことになる。
    kyori = j - i    # j番がi番より何個分後にあるかを求める変数
#  i番の後の間近にi番のデータより小さいデータが見つかったときにその情報を表示する。
     print i+"番のデータ"+msd[i]+"の"+kyori+"番後にもっと小さい"+msd[j]+"があります。"
  else:
#  配列データ中にi番のデータ未満の値がなかったとき、
#  i番自身のデータを表示する。
    print i+"番のデータが最小であり、"+msd[i]+"です。"

  i += 1

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/02/19 14:07

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

    キャンセル

  • 2017/02/19 16:22

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

    キャンセル

  • 2017/02/19 17:19

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

    キャンセル

0

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

n = 12              # 配列の件数
minimum = msd[0]    # 最小値 初期値は0番目の値
miniindex = 0       # 最小値のある配列の添字 初期値は0番目
i = 0               # すべての配列データ捜査のための添字
# 全ての配列データ捜査
while(i<n):
  if msd[i] < minimum:
    minumum = msd[i]
    miniindex = i
    print msd[i]
  else:
    j += 1     
#  配列データが最小値でなかったときの最小値までの
    while msd[j] >= minimum  or j < n:
      j += 1
    if j < n:
      minumum = msd[j]
      miniindex = j
      print j - i
    else:
      print n - i
  i += 1

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Python

    9289questions

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