我正在加载两个JSON文件并对其进行迭代,以便使用另一个的引用替换JSON的值。
{"Target":{
"TV_1":{
"id":"001_101_001",
"query_name":"tvchview",
"param":{"$source":"tv","$channel":["RTL","rrr"]},
"target_group_type":"multiple",
"mapping_list":{}
},
"TV_2":{
"id":"001_101_003",
"query_name":"tvch_1hr",
"param":{"$source":"tv"},
"target_group_type":"multiple",
"mapping_list":{}
}}}
{"Target_queries": {
"tvchview":{
"name":"tvchview",
"description":"Select panelists that have watched a tv channel at least one time.",
"sql":"SELECT DISTINCT pnr, channel AS value FROM $source WHERE channel IN ( $channel ) AND slice_start >= $startdate AND slice_start <= $enddate ;"
},
"tvch_1hr":{
"name":"tvch_1hr",
"description":"Select panelists that have watched tv channels for at least one hour.",
"sql":"SELECT pnr, channel AS value FROM $source WHERE slice_start >= $startdate AND slice_start <= $enddate AND duration >= 3600 AND channel != '-' GROUP BY pnr, channel;"
}}}
当JSON文件如下所示时,我的代码有效,但是当我切换TV_1和TV_2的位置(TV_2代替TV_1的位置)时,我的代码没有返回任何内容,这意味着它与{{1 }}和name
。
这是代码中我替换值的部分:
query_name
for (k, v), (k1, v1) in zip(params_to_replace.items(), queries.items()):
if v1['name'] in v['query_name']:
params = v['param']
split_queries = v1['sql'].split()
final_string = ' '.join(str(params.get(word, word)) for word in split_queries)
final_string = re.sub(r'(\[)|(\])', '', final_string)
replaced_queries[k] = final_string
else:
pass
是查询名称(v1['name']
)和"name":"tvchview"
是名称的地方,但在其他JSON(v['query_name']
)中。当我再次切换查询的结构时,它将再次起作用。以某种方式,仅当查询名称的顺序在两个文件上都匹配时,if语句才搜索。有什么想法吗?
答案 0 :(得分:1)
我认为问题在于zip
语句,该语句仅连接两个条目。相反,您想测试所有可能的组合。为此,您可以使用itertools.product
更正的代码:
import re
import itertools
params_to_replace = {
"TV_2": {
"id": "001_101_003",
"query_name": "tvch_1hr",
"param": {"$source": "tv"},
"target_group_type": "multiple",
"mapping_list": {}
},
"TV_1":{
"id":"001_101_001",
"query_name":"tvchview",
"param":{"$source":"tv","$channel":["RTL","rrr"]},
"target_group_type":"multiple",
"mapping_list":{}
},
}
queries = {
"tvchview":{
"name":"tvchview",
"description":"Select panelists that have watched a tv channel at least one time.",
"sql":"SELECT DISTINCT pnr, channel AS value FROM $source WHERE channel IN ( $channel ) AND slice_start >= $startdate AND slice_start <= $enddate ;"
},
"tvch_1hr":{
"name":"tvch_1hr",
"description":"Select panelists that have watched tv channels for at least one hour.",
"sql":"SELECT pnr, channel AS value FROM $source WHERE slice_start >= $startdate AND slice_start <= $enddate AND duration >= 3600 AND channel != '-' GROUP BY pnr, channel;"
}}
replaced_queries = {}
for (k, v), (k1, v1) in itertools.product(params_to_replace.items(), queries.items()):
if v1['name'] in v['query_name']:
params = v['param']
split_queries = v1['sql'].split()
final_string = ' '.join(str(params.get(word, word)) for word in split_queries)
final_string = re.sub(r'(\[)|(\])', '', final_string)
replaced_queries[k] = final_string
else:
pass
print(replaced_queries)
{'TV_2':“从电视中选择pnr,频道AS值,其中slice_start> = $ startdate AND slice_start <= $ enddate AND持续时间> = 3600 AND channel!='-'GROUP BY pnr,channel;“,' TV_1':“ SELECT DISTINCT pnr,从电视WHERE频道IN中的频道AS值('RTL','rrr')AND slice_start> = $ startdate AND slice_start <= $ enddate;“}