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

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

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

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

Q&A

解決済

3回答

6476閲覧

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

pepasuke623

総合スコア55

Python

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

0グッド

0クリップ

投稿2017/01/19 13:45

編集2017/01/20 12:34

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

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

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

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

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

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/01/19 13:51

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

2017/01/20 12:43

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

2017/01/21 00:58

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

回答3

0

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

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

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

Python

1# データ 2data = [1, 1, 2, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5] 3 4# イテレータ 5data_itr = enumerate(iter(data)) 6# 直前の値 7prev = None 8 9while True: 10 try: 11 # イテレータから次の要素を取得する 12 index, value = next(data_itr) 13 except StopIteration: 14 # もう要素がない場合は while を抜ける 15 break 16 17 if prev == value: 18 # 前の値と同じ 19 print('index: {}, value: {} > 処理1'.format(index, value)) 20 else: 21 # 前の値と異なる 22 print('index: {}, value: {} > 処理2'.format(index, value)) 23 24 prev = value 25 26# index: 0, value: 1 > 処理2 27# index: 1, value: 1 > 処理1 28# index: 2, value: 2 > 処理2 29# index: 3, value: 3 > 処理2 30# index: 4, value: 3 > 処理1 31# index: 5, value: 3 > 処理1 32# index: 6, value: 3 > 処理1 33# index: 7, value: 4 > 処理2 34# index: 8, value: 4 > 処理1 35# index: 9, value: 5 > 処理2 36# index: 10, value: 5 > 処理1 37# index: 11, value: 5 > 処理1 38# index: 12, value: 5 > 処理1

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

Python

1import itertools 2for key, values in itertools.groupby(data): 3 print('key: {}, values: {}'.format(key, list(values))) 4 5# key: 1, values: [1, 1] 6# key: 2, values: [2] 7# key: 3, values: [3, 3, 3, 3] 8# key: 4, values: [4, 4] 9# key: 5, values: [5, 5, 5, 5]

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

Python

1import collections 2data_count = collections.Counter(data) 3print(data_count) 4 5# Counter({3: 4, 5: 4, 1: 2, 4: 2, 2: 1})

投稿2017/01/29 06:16

copepoda

総合スコア324

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

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

0

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

投稿2017/01/20 14:10

yuba

総合スコア5568

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

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

0

ベストアンサー

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

投稿2017/01/19 15:14

t_obara

総合スコア5488

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問