If语句只按特定顺序搜索值



我正在加载两个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的位置(,我的编码不会返回任何内容,这意味着它与namequery_name的两个dict不匹配。

这是代码中我替换值的部分:

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"(,v['query_name']是名称,但在另一个JSON中("query_name":"tvchview"(。当我再次切换查询的结构时,它会再次工作。不知何故,if语句仅在两个文件上的查询名称顺序匹配时才进行搜索。有什么想法吗?

我认为问题出在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,频道作为值,其中slice_start>=$startdate AND slice_start<=$enddate AND duration>=3600 AND channel!='-'按pnr分组,频道;",'TV_1':"选择DISTINCT pnr,从电视中的频道作为值('RTL','rrr'(AND slice-start>=$sstartdate AND slice _start&llt;=$end date;"}

最新更新