如果语句仅按特定顺序搜索值

时间:2020-02-17 15:53:48

标签: python-3.x

我正在加载两个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语句才搜索。有什么想法吗?

1 个答案:

答案 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;“}