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

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

ただいまの
回答率

91.36%

  • Python 3.x

    2411questions

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

多重ループを抜ける方法

受付中

回答 2

投稿 2017/12/08 18:25 ・編集 2017/12/08 19:51

  • 評価
  • クリップ 1
  • VIEW 90

Looove

score 2

前提・実現したいこと

多重ループの抜け方がわからないです

発生している問題・エラーメッセージ

多重ループを抜ける際breakなのかsys.exitなのかその他諸々なのかどれを選択すればいいのかわかりません。

該当のソースコード

import xlrd
import os.path
import numpy as np
import itertools
import sys
import openpyxl
import collections

xlfile = "結果.xlsx"
if os.path.exists(xlfile):
    xls = xlrd.open_workbook(xlfile)
    sheet1 = xls.sheet_by_index(0)
    nrows = sheet1.nrows
    ncols = sheet1.ncols 
    data = np.zeros(ncols*nrows).reshape((nrows, ncols))
    surablist = []
    atusalist = []
    seibunlist = []
    taisekilist = []
    kekkalist = []
    kekkalist4 = []
    kekka = []

    for r in range(0, nrows):
        for c in range(0, ncols):
            data[r,c] = sheet1.cell(r,c).value

    for r in range(0, nrows):
        surablist.append(data[r,0])
        atusalist.append(data[r,2])
        seibunlist.append(data[r,3])
        taisekilist.append(data[r,5])

    for i, _ in enumerate(surablist, 4):
        if i == 5:
         break
        for j in itertools.combinations(surablist, r=i):
              if i == 4:
               g = int(j[0]-1)
               u = int(j[1]-1)
               z = int(j[2]-1)
               a = int(j[3]-1)
               if data[g,3] == data[u,3] and data[g,3] == data[a,3] and data[g,3] == data[z,3] and data[u,3] == data[z,3] and data[a,3] == data[u,3] and data[z,3] == data[a,3] and data[g,2] + data[u,2] + data[z,2] + data[a,2] <= 2.0 and data[g,5] + data[u,5] + data[z,5] + data[a,5] <= 2.56:
                kekkalist4.append(j)



z = 0
a = 0

z = len(kekkalist4) 
set(map(tuple, kekkalist4))
for bb in range(0,z-1):
    for bc in range(bb+1,z):
        for bd in range(bc+1,z):
            for be in range(bd+1,z):
                for bf in range(be+1,z):
                    for bg in range(bf+1,z):
                        for bh in range(bg+1,z):
                            for bi in range(bh+1,z):
                                for bj in range(bi+1,z):
                                   set1 = set(kekkalist4[bb])
                                   set2 = set(kekkalist4[bc])
                                   set3 = set(kekkalist4[bd])
                                   set4 = set(kekkalist4[be])
                                   set5 = set(kekkalist4[bf])
                                   set6 = set(kekkalist4[bg])
                                   set7 = set(kekkalist4[bh])
                                   set8 = set(kekkalist4[bi])
                                   set9 = set(kekkalist4[bj])
                                   a += 1
                                   print(a)
                                   if bool (set1&set2) == True:
                                       np.delete(kekkalist4,bc)
                                       sys.exit
                                   elif bool (set1&set3) == True:
                                       np.delete(kekkalist4,bd)
                                       sys.exit
                                   elif bool (set1&set4) == True:
                                       np.delete(kekkalist4,be)
                                       sys.exit
                                   elif bool (set1&set5) == True:
                                       np.delete(kekkalist4,bf)
                                       sys.exit
                                   elif bool (set1&set6) == True:
                                       np.delete(kekkalist4,bg)
                                       sys.exit
                                   elif bool (set1&set7) == True:
                                       np.delete(kekkalist4,bh)
                                       sys.exit
                                   elif bool (set1&set8) == True:
                                       np.delete(kekkalist4,bi)
                                       sys.exit
                                   elif bool (set1&set9) == True:
                                       np.delete(kekkalist4,bj)
                                       sys.exit
                                   elif bool (set2&set3) == True:
                                       np.delete(kekkalist4,bd)
                                       sys.exit
                                   elif bool (set2&set4) == True:
                                       np.delete(kekkalist4,be)
                                       sys.exit
                                   elif bool (set2&set5) == True:
                                       np.delete(kekkalist4,bf)
                                       sys.exit
                                   elif bool (set2&set6) == True:
                                       np.delete(kekkalist4,bg)
                                       sys.exit
                                   elif bool (set2&set7) == True:
                                       np.delete(kekkalist4,bh)
                                       sys.exit
                                   elif bool (set2&set8) == True:
                                       np.delete(kekkalist4,bi)
                                       sys.exit
                                   elif bool (set2&set9) == True:
                                       np.delete(kekkalist4,bj)
                                       sys.exit
                                   elif bool (set3&set4) == True:
                                       np.delete(kekkalist4,be)
                                       sys.exit
                                   elif bool (set3&set5) == True:
                                       np.delete(kekkalist4,bf)
                                       sys.exit
                                   elif bool (set3&set6) == True:
                                       np.delete(kekkalist4,bg)
                                       sys.exit
                                   elif bool (set3&set7) == True:
                                       np.delete(kekkalist4,bh)
                                       sys.exit
                                   elif bool (set3&set8) == True:
                                       np.delete(kekkalist4,bi)
                                       sys.exit
                                   elif bool (set3&set9) == True:
                                       np.delete(kekkalist4,bj)
                                       sys.exit
                                   elif bool (set4&set5) == True:
                                       np.delete(kekkalist4,bf)
                                       sys.exit
                                   elif bool (set4&set6) == True:
                                       np.delete(kekkalist4,bg)
                                       sys.exit
                                   elif bool (set4&set7) == True:
                                       np.delete(kekkalist4,bh)
                                       sys.exit
                                   elif bool (set4&set8) == True:
                                       np.delete(kekkalist4,bi)
                                       sys.exit
                                   elif bool (set4&set9) == True:
                                       np.delete(kekkalist4,bj)
                                       sys.exit
                                   elif bool (set5&set6) == True:
                                       np.delete(kekkalist4,bg)
                                       sys.exit
                                   elif bool (set5&set7) == True:
                                       np.delete(kekkalist4,bh)
                                       sys.exit
                                   elif bool (set5&set8) == True:
                                       np.delete(kekkalist4,bi)
                                       sys.exit
                                   elif bool (set5&set9) == True:
                                       np.delete(kekkalist4,bj)
                                       sys.exit
                                   elif bool (set6&set7) == True:
                                       np.delete(kekkalist4,bh)
                                       sys.exit
                                   elif bool (set7&set8) == True:
                                       np.delete(kekkalist4,bi)
                                       sys.exit
                                   elif bool (set7&set9) == True:
                                       np.delete(kekkalist4,bj)
                                       sys.exit
                                   elif bool (set8&set9) == True:
                                       np.delete(kekkalist4,bj)
                                       sys.exit
                                   else:
                                       print (set1,set2,set3,set4,set5,set6,set7,set8,set9)

   sys.exitの部分で一番はじめのループに戻りたいです。この記述で戻れているでしょうか。      エクセルファイルはこのようになっています   イメージ説明

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

+4

itertools.productを使うとループを浅くできますのでbreakもしやすいかと。

 productがない時

for i in range(10):
    for j in range(5):
        print(i, j)

 productがある時

from itertools import product

for i, j in product(range(10), range(5)):
    print(i, j)

 productがなくても出来ること

def gen_bb_to_bj(z)
    for bb in range(0,z-1):
        for bc in range(bb+1,z):
            for bd in range(bc+1,z):
                for be in range(bd+1,z):
                    for bf in range(be+1,z):
                        for bg in range(bf+1,z):
                            for bh in range(bg+1,z):
                                for bi in range(bh+1,z):
                                    for bj in range(bi+1,z):
                                        yield bb, bc, bd, be, bf, bg, bh, bi, bj

for bb_to_bj in gen_bb_to_bj(10):
    pass  # なんかの処理

 多分もっとフラットに書けるはず

組み合わせを元にループしようとしているように見えるのでitertoolsを使えばもうちょっと見通しよく書けると思うのですが、いかんせんfor文の連鎖でどんな組み合わせをループしようとしているのか分からなかったので、ここまでです。

投稿 2017/12/08 18:53

編集 2017/12/08 19:26

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/09 00:49

    pythonでは特定のループを抜けて、特定のループに着陸するような処方箋は用意されておりません。
    というのが回答かと思います。

    関数の中に突っ込めば任意のループでリターンできますし、itertoolsによってループのネスティングを緩和せることもできます。

    FORTRANではズバリ要求するようなことができますが、オブジェクト指向で正しく書かれてコードでは起こり得ない問題であるので言語定義から排除されたように思えます。

    キャンセル

  • 2017/12/09 01:38

    そうですね。聞かれたことにまっすぐ答えるとそうなりますね。ちなみにPythonでもジョークでgotoをこしらえた人がいるらしいです。https://github.com/snoack/python-goto/blob/master/README.md

    キャンセル

  • 2017/12/09 01:58

    お返事ありがとうございます。
    さすがエイプリルフールですね。
    FORTRANがgoto文からfor文に乗り換えたことを考えるといかに事故が多かったのかが伺えます…

    キャンセル

  • 2017/12/09 02:28

    Javaにはラベル付きbreakがありますが、正直使い勝手は良くないです。
    そもそも論になりますが、やはり二重より深いループは設計上排除すべきなのでしょうね。
    一重は言わずもがな、二重なら(適切にモジュール化されていれば)returnで脱出可能ですし。
    goto文が欲しくなった時点で設計が怪しいような。

    キャンセル

  • 2017/12/09 02:44

    ですね。迷ったら`import this`とPEP8に尽きます。

    キャンセル

+1

関数は呼び出さないと意味がありません。
プログラム自体を終了させていいのであれば、ですが...

sys.exit()

ただ、そのネストの多さではまともな処理速度が期待できないので、
設計自体を見直すことを強くお勧めします。

追記

参考までに、(おそらく)要件を満たす組み合わせを出力するコードです。
各要素の役割がわからないので、マジックナンバーが多いのはご容赦ください。

import random
import itertools

def flatten(dim_2):
    return [elem for row in a_set for elem in row]

# 適当にそれっぽいデータを作る
hoge = [
    [random.randint(0, 1000) for _ in range(4)]
    for _ in range(250)
]

for a_set in itertools.combinations(hoge, 9):
    a_set = set(flatten(a_set))

    if len(a_set) != 9 * 4:
        continue

    print(a_set)

なお、結果が一意でなくてよいのなら、random.sampleを用いてもいいでしょう。

投稿 2017/12/08 18:29

編集 2017/12/08 19:30

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/08 18:46

    具体的にはどの辺りを改善できそうでしょうか?

    キャンセル

  • 2017/12/08 18:49

    for文を連ねているようですが、これは何をしようとしているのでしょうか?
    zの長さ9の順列でしょうか?

    キャンセル

  • 2017/12/08 18:58

    4個の数字の組み合わせが250あります。その、組み合わせの中から9個選び最終的には36個の数を抽出しようとしています。また、36個の数字は1つも同じ数字が被らないようにしたいです。

    キャンセル

  • 2017/12/08 19:12

    先に9つの組み合わせを考えてから、条件に一致するものを抽出する方法も考えたのですが、計算量が多くなってしまうのでは?と考えやめました。一応貼っておきます…
    ```
    for i, _ in enumerate(kekkalist4,9):
    if i == 10:
    break
    for k in itertools.combinations(kekkalist4, r=i):
    set(map(tuple, k))
    for y in range(0,9):
    for x in range(0,9):
    set_ = set(k[y])
    set__ = set(k[x])
    if x == y:
    pass
    elif bool (set_ & set__) == True:
    np.delete(k,x)
    sys.exit
    if y == 8 and x == 8:
    print (k)
    ```

    キャンセル

  • 2017/12/08 19:19

    条件を満たす『36個の数字』を一組でも見つければよいのでしょうか?

    キャンセル

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

ただいまの回答率

91.36%

関連した質問

  • 解決済

    python3でpickleを使ってCIFAR10を読み込むと「UnicodeDecodeError...

    ChainerでCIFAR-10の分類をしようと思ったのですが、データを読み込むところでエラーが発生して調べても解決策がわからなかったので質問させていただきます。 http:

  • 解決済

    【Python】標準入出力におけるリスト格納について

    前提・実現したいこと ここに質問したいことを詳細に書いてください (例)PHP(CakePHP)で●●なシステムを作っています。 ■■な機能を実装中に以下のエラーメッセージが

  • 解決済

    Pythonのthreadingにおける、終了時の処理

    前提・実現したいこと Pythonを使って、動画や画像を表示するGUIを作っています。その中で、みなさまのご支援を頂ながらカメラの画像を取り込んで再生できるところまで来ました。

  • 解決済

    python 標準入力

    初歩的な質問で申し訳ありません pythonで 1234 5678 9999 のように入力したとき 配列 e[0][0]=1 e[0][1]=2 e[0][2]=3 ... e[2

  • 解決済

    pygameでKEY操作ができない。

    pygameで from pygame.locals import KEYDOWN, KEY_RIGHT, KEY_LEFT, K_UP, KDOWN をimportして十字キーを

  • 解決済

    self.rect.xなどに値が代入されない

    壁のあたり判定をつけたいのですがflgだけ確認でき、値が代入されません。 解決方法、こうしたほうがいい点ありましたらお願いします import pygame from pyga

  • 解決済

    Python 内包表記

    jupyter notebookでとある数列を求めるプログラムを作りました。 for文の中にあるfor文(for j in range(compare.size + 1)...)を

  • 受付中

    関数(def)の問題について

    前提・実現したいこと 以下の問題を解くプログラムを教えて下さい。 整数w,hを引数にとり、横幅がw,高さhの長方形を 要素&で表示する関数rectangle(w,h) (動作例

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

  • Python 3.x

    2411questions

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