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

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

ただいまの
回答率

91.36%

  • Python 3.x

    2410questions

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

  • Excel

    966questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • for

    137questions

    for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

  • if

    125questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

for、if文での結果の表示方法

解決済

回答 1

投稿 2017/12/01 16:10 ・編集 2017/12/01 16:31

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

Looove

score 2

前提・実現したいこと

エクセルファイルからデータを読み込み、組み合わせを考え、条件が一致するもののみ表示したいです。

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

最終的な結果のみ表示したいのですが、if文の処理が終了する度に結果が表示されてしまいます。

該当のソースコード

Excelファイルです
![イメージ説明](6f1e0f1ea51b4e051fb81947fa0656af.png)

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

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 = []
    kekkalist = []
    b = range(1,37)
    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])

    for i, _ in enumerate(surablist, 2):
        if i == 6:
         sys.exit()
        for j in itertools.combinations(surablist, r=i):
              if i == 2:
               n = int(j[0]-1)
               m = int(j[1]-1)
               if data[n,3] == data[m,3] and data[n,2] + data[m,2] <= 2.0:
                kekkalist.append(j)

              elif i == 3:
               o = int(j[0]-1)
               p = int(j[1]-1)
               v = int(j[2]-1)
               if data[o,3] == data[p,3] and data[o,3] == data[v,3] and data[p,3] == data[v,3] and data[o,2] + data[p,2] + data[v,2] <= 2.0:
                kekkalist.append(j)

              elif 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:
                kekkalist.append(j)

              else:
               q = int(j[0]-1)
               w = int(j[1]-1)
               e = int(j[2]-1)
               f = int(j[3]-1)
               h = int(j[4]-1)
               if data[q,3] == data[w,3] and data[q,3] == data[f,3] and data[q,3] == data[e,3] and data[q,3] == data[h,3] and data[w,3] == data[e,3] and data[f,3] == data[w,3] and data[h,3] == data[w,3] and data[e,3] == data[f,3] and data[e,3] == data[h,3] and data[f,3] == data[h,3] and data[q,2] + data[w,2] + data[e,2] + data[f,2] + data[h,2] <= 2.0:
                 kekkalist.append(j)
        print (kekkalist)

これだと例えばですが以下のようにに出力されてしまいます

[(1.0, 2.0)]
[(1.0, 2.0), (1.0, 2.0, 3.0)]
[(1.0, 2.0), (1.0, 2.0, 3.0), (1.0, 2.0, 3.0, 4.0)]
[(1.0, 2.0), (1.0, 2.0, 3.0), (1.0, 2.0, 3.0, 4.0), (1.0, 2.0, 3.0, 4.0, 5.0)]

理想の出力結果は

[(1.0, 2.0), (1.0, 2.0, 3.0), (1.0, 2.0, 3.0, 4.0), (1.0, 2.0, 3.0, 4.0, 5.0)]
のみです。

試したこと

最後の行のprint(kekkalist)の位置を変えてみましたが、変えてしまうと何も表示されなくなりました。

補足情報(言語/FW/ツール等のバージョンなど)

python3です。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Udomomo

    2017/12/01 16:17

    コードを全部質問文にペーストし、前後の行に```を付け足していただけるでしょうか?回答する方が手元の環境で試しやすくなります。

    キャンセル

  • Looove

    2017/12/01 16:26

    ご指摘ありがとうございます。修正します。

    キャンセル

回答 1

checkベストアンサー

+1

最後の行のprint(kekkalist)の位置を変えてみましたが、変えてしまうと何も表示されなくなりました。

脱出時にsys.exitしているからじゃないですかね。普通にbreakすればよいかと思います。


それ以外にも、ちょっとコードが煩雑な印象を受けます。
条件を見直して、少しずつ書き直せるとよさそうですね(投げやりですみません)。

ぱっと思いつく改善点としては、こんなところでしょうか。

if not os.path.exists(xlfile):
    sys.exit(1)

...

ネストが一段減り、これだけで『精神的スタック』が減ります。これは大きな改善です。

質問でのコードの貼り方

基本的に、画像を張り付けることは歓迎されません。

teratailには、私の回答のようにコードを見やすく表示する機能があります。
詳しくはヘルプをご覧ください。

投稿 2017/12/01 16:13

編集 2017/12/01 16:20

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/01 16:43

    一週間ほど苦しめられていたので涙が出そうです。ありがとうございました。

    キャンセル

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

ただいまの回答率

91.36%

関連した質問

  • 解決済

    SQLパラメーター式テーブルの値をand検索する

    実現したいこと fruit_id : 1 -> apple fruit_id : 2 -> mikan fruit_id : 3 -> banana テーブル名 : f

  • 解決済

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

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

  • 解決済

    IntelliJ IDEA でKotlinの実行ができない

    実現したいこと IntelliJ IDEAで Kotlinのプログラムを実行したいです。 しかしエラーが表示されてしまいます。 ソースコード package sampl

  • 解決済

    pythonのmatplotlibで3次元の直方体を描きたい

    pythonのmatplotlibのグラフ上に3次元の直方体を描きたいです.調べてみたらmplot3dなどを使えば出来そうな気がしましたが,使い方がよくわかりませんでした.pyth

  • 解決済

    python 標準入力

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

  • 解決済

    python エラー

    weights, params = [], [] for c in np.arange(-5, 5): lr = LogisticRegression(C=10**c,

  • 解決済

    python 真偽を網羅的に表にして表示したい

    前提・実現したいこと pythonという言語を用いてfront_tableの中の条件で真偽の組み合わせを網羅的に 表として表示するのを一般化したい。 front_tableの中

  • 解決済

    条件に対応した期待値を取り出す

    前提・実演したいこと 条件の組み合わせから、期待値を取り出し表示できるようにしたい。 例えば、表の表側(front_table)と表頭(table_head)、そして期待値とし

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

  • Python 3.x

    2410questions

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

  • Excel

    966questions

    Excelは、マイクロソフト社が開発しているデータ集計や分析を行う表計算ソフトの一つです。文書作成や表計算、資料作成などの多彩な機能を備えており、統合パッケージであるMicrosoft Officeに含まれています。

  • for

    137questions

    for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

  • if

    125questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。