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

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

ただいまの
回答率

90.54%

  • Python

    11267questions

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

配列の外に出たことの判定

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,063

pepasuke623

score 34

Pythonに関する質問です。
whileループなどを使うと配列の外に出てキーエラーになってしまうことがあります。
例えば配列とかタプルの大きさが5だとすると6個すすむと外に出てしまいます。
この6個進んで配列の外に出たときを判定する方法はありませんでしょうか?

追記
ちょっとわかりにくいのでもうちょっと詳しくご説明します。
例えばこういうデータ列があったとします

1 1 2 3 3 3 3 4 4 5 5 5 5

同じ文字が何個か並んでいて,同じ文字の個数はそれぞれバラバラです.

いまやろうとしていることは
While文で現在選択している文字と前の文字が同じならば処理1をして違えば処理2をしようとしています。
こうしようとすると何処かでデータの外に出てしまいます。
確かにレンジを取ってForループでも出来るのですが,
Whileループでやるにはどうしたら良いのか自分では思いつかなかったので聞いてみました.

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • w_nagai

    2017/01/19 22:51

    ソースコードなど参考になるモノがないと答えが得りづらいですね

    キャンセル

  • Lhankor_Mhy

    2017/01/20 21:43

    追記の処理でも、tomohiro_obaraさんの回答のとおりだと思います。または普通にwhile文にi<len(list)みたいに書くとかでもいいと思います。不明な点はどこでしょうか。

    キャンセル

  • pepasuke623

    2017/01/21 09:58

    確かにおっしゃるとおりです。while文にi<len(list)と書けば十分な気がします。この件はクローズします。色々ご指摘いただきありがとうございました。

    キャンセル

回答 3

checkベストアンサー

0

配列の参照をする前に、配列のサイズなりを確認します。
サイズが5だとすると、6になった時点で配列の参照をせずにループから出るようにします。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

番兵という方法があります。
whileの脱出条件に必ず引っかかるようなデータを配列の最後に追加しておくというやり方。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

イテレータにするという方法もあります。

iter 関数を使用して、イテレータにすると next 関数で要素を順に取得することができます。
next 関数は、もう要素がない場合に StopIteration 例外を投げます。

また、ご質問の内容からは分かりませんでしたが、
ループカウンタが必要な場合は、enumerate 関数を使用します。

# データ
data = [1, 1, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5]

# イテレータ
data_itr = enumerate(iter(data))
# 直前の値
prev = None

while True:
    try:
        # イテレータから次の要素を取得する
        index, value = next(data_itr)
    except StopIteration:
        # もう要素がない場合は while を抜ける
        break

    if prev == value:
        # 前の値と同じ
        print('index: {}, value: {} > 処理1'.format(index, value))
    else:
        # 前の値と異なる
        print('index: {}, value: {} > 処理2'.format(index, value))

    prev = value

# index: 0, value: 1 > 処理2
# index: 1, value: 1 > 処理1
# index: 2, value: 2 > 処理2
# index: 3, value: 3 > 処理2
# index: 4, value: 3 > 処理1
# index: 5, value: 3 > 処理1
# index: 6, value: 3 > 処理1
# index: 7, value: 4 > 処理2
# index: 8, value: 4 > 処理1
# index: 9, value: 5 > 処理2
# index: 10, value: 5 > 処理1
# index: 11, value: 5 > 処理1
# index: 12, value: 5 > 処理1

以降、蛇足ですが、
キーブレイクをやりたいのであれば、itertools.groupby でできます。

import itertools
for key, values in itertools.groupby(data):
    print('key: {}, values: {}'.format(key, list(values)))

# key: 1, values: [1, 1]
# key: 2, values: [2]
# key: 3, values: [3, 3, 3, 3]
# key: 4, values: [4, 4]
# key: 5, values: [5, 5, 5, 5]

同じ値の数をカウントしたいのであれば、collections.Counter でできます。
これは、Key が要素、Value がその要素の数となる辞書になります。

import collections
data_count = collections.Counter(data)
print(data_count)

# Counter({3: 4, 5: 4, 1: 2, 4: 2, 2: 1})

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Python

    11267questions

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