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'
}
}
]
最善の解決策は何ですか?
ありがとう。
あなたの質問を理解しているので、あなたは全体を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]
コメントを追加