内側のループを終了するときに、外側のループを数回続行します(Python)

ファブリス

1つの内部ループと1つの外部ループ(データベース内のレコード)があります。外側のループ(json)は、いくつかのフィールドに基づいてフィルターを作成します(例:begin / end => 0:0.5 >>> ID 114〜159)。

テーブル :

ID    begin     end  status  FK1_field  FK2_field FK3_field FK4_field  FK5_field    report_id

114    0        0.5    1      NULL      13          8         142       44            1
115    0        0.5    1      NULL      13          8         61        45            1
158    0        0.5    1      NULL      13          8         142       45            1
159    0        0.5    1      NULL      13          8         61        44            1
116    0.5      1.5    1      NULL      13          8         142       45            1
117    0.5      1.5    1      NULL      13          8         131       45            1
118    1.5      2.5    1      NULL      13          8         142       45            1

結果は、内側のループをループします(例:4レコード/行(*))。

ただし、内側のループを終了するときは、外側のループを4回(*)ループして、ID 116(およびフィルターの開始/終了)=> 0.5:1.5を取得する必要があります。

確かに、私は内側のループだけをループして、同じカップル回「if」でテストすることができます。しかし、フィルタリングはよりエレガントだと思います。今のところ、内側のループを出るときのループはばかげていると思います。

コード :

highways = tools_cronjob.getAPI(API_URL + action, headers)
for highway in highways:
    print('>>>>> Highway : %s ' % highway['name'])

    # all the prpk, same values like the table
    prpk_by_highway = tools_cronjob.getAPI(API_URL + actions_api['prpk_by_highway'] + "%s" % (highway['id']), headers)

    # get all prpk by highway
    for prpk in prpk_by_highway:
        filtered_by_begin_end = [pr_pk for pr_pk in prpk_by_highway if pr_pk['begin'] == prpk['begin']]

        # each couple of prpk 'begin' and 'end'
        for filter_prpk in filtered_prpk_by_begin_end:
            # some stuff
            print (filter_prpk)
            # when I exit, for eg, I must continue looping (prpk in prpk_by_highway) starting the couple begin/end : 0.5 : 1.5 

したがって、最初のループは4レコード、2番目は2レコード、3番目は1レコードです。Json:

[
   {
      'end':0.5,
      'begin':0.0,
      'status':'1',
      'department':{
         'number':'13',
         'id':13,
         'name':'Bouches-du-Rhône'
      },
      'meteozone':{
         'id':44,
         'name':'137'
      },
      'commune':None,
      'massif':{
         'meteozones':[
            {
               'id':44,
               'name':'137'
            },
            {
               'id':45,
               'name':'138'
            },
            {
               'id':104,
               'name':'831'
            },
            {
               'id':105,
               'name':'832'
            }
         ],
         'id':142,
         'name':'Sainte-baume'
      }
   },
   {
      'end':0.5,
      'begin':0.0,
      'status':'1',
      'department':{
         'number':'13',
         'id':13,
         'name':'Bouches-du-Rhône'
      },
      'meteozone':{
         'id':45,
         'name':'138'
      },
      'commune':None,
      'massif':{
         'meteozones':[
            {
               'id':45,
               'name':'138'
            }
         ],
         'id':61,
         'name':'Garlaban'
      }
   },
   {
      'end':0.5,
      'begin':0.0,
      'status':'1',
      'department':{
         'number':'13',
         'id':13,
         'name':'Bouches-du-Rhône'
      },
      'meteozone':{
         'id':45,
         'name':'138'
      },
      'commune':None,
      'massif':{
         'meteozones':[
            {
               'id':44,
               'name':'137'
            },
            {
               'id':45,
               'name':'138'
            },
            {
               'id':104,
               'name':'831'
            },
            {
               'id':105,
               'name':'832'
            }
         ],
         'id':142,
         'name':'Sainte-baume'
      }
   },
   {
      'end':0.5,
      'begin':0.0,
      'status':'1',
      'department':{
         'number':'13',
         'id':13,
         'name':'Bouches-du-Rhône'
      },
      'meteozone':{
         'id':44,
         'name':'137'
      },
      'commune':None,
      'massif':{
         'meteozones':[
            {
               'id':45,
               'name':'138'
            }
         ],
         'id':61,
         'name':'Garlaban'
      }
   },
   {
      'end':1.5,
      'begin':0.5,
      'status':'1',
      'department':{
         'number':'13',
         'id':13,
         'name':'Bouches-du-Rhône'
      },
      'meteozone':{
         'id':45,
         'name':'138'
      },
      'commune':None,
      'massif':{
         'meteozones':[
            {
               'id':44,
               'name':'137'
            },
            {
               'id':45,
               'name':'138'
            },
            {
               'id':104,
               'name':'831'
            },
            {
               'id':105,
               'name':'832'
            }
         ],
         'id':142,
         'name':'Sainte-baume'
      }
   },
   {
      'end':1.5,
      'begin':0.5,
      'status':'1',
      'department':{
         'number':'13',
         'id':13,
         'name':'Bouches-du-Rhône'
      },
      'meteozone':{
         'id':45,
         'name':'138'
      },
      'commune':None,
      'massif':{
         'meteozones':[
            {
               'id':43,
               'name':'136'
            },
            {
               'id':45,
               'name':'138'
            }
         ],
         'id':131,
         'name':'Régagnas'
      }
   },
   {
      'end':2.5,
      'begin':1.5,
      'status':'1',
      'department':{
         'number':'13',
         'id':13,
         'name':'Bouches-du-Rhône'
      },
      'meteozone':{
         'id':45,
         'name':'138'
      },
      'commune':None,
      'massif':{
         'meteozones':[
            {
               'id':44,
               'name':'137'
            },
            {
               'id':45,
               'name':'138'
            },
            {
               'id':104,
               'name':'831'
            },
            {
               'id':105,
               'name':'832'
            }
         ],
         'id':142,
         'name':'Sainte-baume'
      }
   }
]

最善の解決策は何ですか?

ありがとう。

tobias_k

あなたの質問を理解しているので、あなたは全体をbeginフィールドごとにグループ化したいと思います。これを行うには、すべてのエントリをループしてから、(リスト内包表記で)すべてのエントリを再度ループして、同じものを見つけますbeginが、外側のループは中断したところから続行されます。

代わりに、を使用itertools.groupbyしてエントリをその属性でグループ化することをお勧めします。これは、エントリが同じ属性でソートされていることを前提としているため、そうでない場合は、最初にソートすることに注意してください。

import csv, itertools, operator
with open("data.csv") as data:
    prpk_by_highway = csv.DictReader(data)
    for key, group in itertools.groupby(prpk_by_highway, key=operator.itemgetter("begin")):
        print("BEGIN", key)
        for prpk in group:
            print(prpk)

これdata.csvは、データを保持するCSVファイルです。つまり、tools_cronjob.getAPI通話を使用しても同じことが機能するはずです。出力:

BEGIN 0
OrderedDict([('ID', '114'), ('begin', '0'), ('end', '0.5'), ('status', '1'), ('FK', '44'), ('report_id', '1')])
OrderedDict([('ID', '115'), ('begin', '0'), ('end', '0.5'), ('status', '1'), ('FK', '45'), ('report_id', '1')])
OrderedDict([('ID', '158'), ('begin', '0'), ('end', '0.5'), ('status', '1'), ('FK', '45'), ('report_id', '1')])
OrderedDict([('ID', '159'), ('begin', '0'), ('end', '0.5'), ('status', '1'), ('FK', '44'), ('report_id', '1')])
BEGIN 0.5
OrderedDict([('ID', '116'), ('begin', '0.5'), ('end', '1.5'), ('status', '1'), ('FK', '45'), ('report_id', '1')])
OrderedDict([('ID', '117'), ('begin', '0.5'), ('end', '1.5'), ('status', '1'), ('FK', '45'), ('report_id', '1')])
BEGIN 1.5
OrderedDict([('ID', '118'), ('begin', '1.5'), ('end', '2.5'), ('status', '1'), ('FK', '45'), ('report_id', '1')])

または、を使用しdictて、一致するエントリをバケットに入れることもできます

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ループの内側と外側のファイルにbashを追加する

分類Dev

内側のループがジョブを完了したときに外側のループの実行を停止する

分類Dev

内側のDONEが外側のWHILEループを終了する可能性はありますか?

分類Dev

内側のDONEが外側のWHILEループを終了する可能性はありますか?

分類Dev

switch caseを使用すると、case内のブレークにより、ループ反復の外側のfor ...が終了します。

分類Dev

Pythonでループの外側からループを終了する方法

分類Dev

C#foreachループは、外側のループから内側のループに値を取ります

分類Dev

javascriptのループの内側と外側でpromiseを条件付きでチェーンする

分類Dev

内側のループをエスケープし、アクションの実行後に外側のループに移動する

分類Dev

外側のグループを最大化するときに内側のアウトライングループを非表示に保つ方法

分類Dev

Rubyで内側のループを壊して次に外側のループを壊す方法は?

分類Dev

Vue-ループの外側に要素を追加します

分類Dev

whileループの内側にオブジェクトを作成し、外側に印刷します

分類Dev

appendChildを使用してループの内側または外側でdiv変数を宣言する

分類Dev

変数を使用する正しい方法-関数ループの内側または外側

分類Dev

ループの内側からループの外側に変数を設定しようとすると、値が十分に長く存続しません

分類Dev

内側と外側の括弧を含む括弧のグループをキャプチャする正規表現

分類Dev

ベクトルの要素でforループを実行し、forループの内側とforループの外側でベクトルを錆びて変更するにはどうすればよいですか?

分類Dev

ggplotなぜ新しい要素を追加すると、ループの外側ではなく内側の色が上書きされるのですか?

分類Dev

ループの内側または外側でローカルを宣言する方が良いですか?

分類Dev

C ++:ループの内側または外側のベクトルを宣言します

分類Dev

ループの内側に戻る-ループの外側にあることを確認するにはどうすればよいですか?

分類Dev

よりきれいなコードのためにforループの内側または外側に条件を追加する方が良いですか?

分類Dev

どのように私は、外側と内側のループで作成されたグリッド上の次の列を変更できますか?

分類Dev

ループの内側から数値を追加して、外側の合計を表示します。Java

分類Dev

内側のループから外側のループの始まりにブレークする方法

分類Dev

forループの内側の辞書はTypeErrorになり、forループの外側は正常に機能します

分類Dev

ループの外側のボタンを参照しますか?

分類Dev

外側のForループを壊す

Related 関連記事

  1. 1

    ループの内側と外側のファイルにbashを追加する

  2. 2

    内側のループがジョブを完了したときに外側のループの実行を停止する

  3. 3

    内側のDONEが外側のWHILEループを終了する可能性はありますか?

  4. 4

    内側のDONEが外側のWHILEループを終了する可能性はありますか?

  5. 5

    switch caseを使用すると、case内のブレークにより、ループ反復の外側のfor ...が終了します。

  6. 6

    Pythonでループの外側からループを終了する方法

  7. 7

    C#foreachループは、外側のループから内側のループに値を取ります

  8. 8

    javascriptのループの内側と外側でpromiseを条件付きでチェーンする

  9. 9

    内側のループをエスケープし、アクションの実行後に外側のループに移動する

  10. 10

    外側のグループを最大化するときに内側のアウトライングループを非表示に保つ方法

  11. 11

    Rubyで内側のループを壊して次に外側のループを壊す方法は?

  12. 12

    Vue-ループの外側に要素を追加します

  13. 13

    whileループの内側にオブジェクトを作成し、外側に印刷します

  14. 14

    appendChildを使用してループの内側または外側でdiv変数を宣言する

  15. 15

    変数を使用する正しい方法-関数ループの内側または外側

  16. 16

    ループの内側からループの外側に変数を設定しようとすると、値が十分に長く存続しません

  17. 17

    内側と外側の括弧を含む括弧のグループをキャプチャする正規表現

  18. 18

    ベクトルの要素でforループを実行し、forループの内側とforループの外側でベクトルを錆びて変更するにはどうすればよいですか?

  19. 19

    ggplotなぜ新しい要素を追加すると、ループの外側ではなく内側の色が上書きされるのですか?

  20. 20

    ループの内側または外側でローカルを宣言する方が良いですか?

  21. 21

    C ++:ループの内側または外側のベクトルを宣言します

  22. 22

    ループの内側に戻る-ループの外側にあることを確認するにはどうすればよいですか?

  23. 23

    よりきれいなコードのためにforループの内側または外側に条件を追加する方が良いですか?

  24. 24

    どのように私は、外側と内側のループで作成されたグリッド上の次の列を変更できますか?

  25. 25

    ループの内側から数値を追加して、外側の合計を表示します。Java

  26. 26

    内側のループから外側のループの始まりにブレークする方法

  27. 27

    forループの内側の辞書はTypeErrorになり、forループの外側は正常に機能します

  28. 28

    ループの外側のボタンを参照しますか?

  29. 29

    外側のForループを壊す

ホットタグ

アーカイブ