使用多个参数搜索json文件

时间:2018-01-16 03:46:46

标签: python json dictionary

我试图在大型python字典中搜索具有这些参数的项目 - >

" DF"在3到4之间

" AR"在6到9之间

" OD"介于1和2之间

json字符串看起来像这样

values = { "key1" : { "ar" : 8, "df" : 3, "od" : 1, "id" : 1} , 
           "key2" : { "ar" : 5, "df" : 3, "od" : 5, "id" : 2},
           "key3" : { "ar" : 6, "df" : 4, "od" : 2, "id" : 3}}

我想只得到满足我条件的值(key1和3),但我也不想为每种组合制作一整行代码(如果我只是想搜索" od"和" df"或仅" ar")。 我设法只搜索值作为下面的例子

ar_range_min = 6
ar_range_max = 9
df_range_min = 3
df_range_min = 4
myDict = { "key1" : { "ar" : 8, "df" : 3, "od" : 1, "id" : 1} , 
           "key2" : { "ar" : 5, "df" : 3, "od" : 5, "id" : 2},
           "key3" : { "ar" : 6, "df" : 4, "od" : 2, "id" : 3}}

def df_search(df_min, df_max):
    global values, df_range
    listOfDicts = []
    foreach k in myDict:
        z = z+1
        if df_min <= k["df"] >= df_max:
            listOfDicts.append(k)  
    return listOfDicts

def ar_search(ar_min, ar_max):
    global values
    listOfDicts = []
    foreach k in myDict:
        z = z+1
        if ar_min <= k["ar"] >= ar_max:
            listOfDicts.append(k)  
    return listOfDicts

match_df = df_search(df_range_min, df_range_max)
match_ar = ar_search(ar_range_min, ar_range_max)
match_both = ???

我不知道如何使用match_df和match_ar 之间的共同值创建新词典,如果我有3个词典(参数),如何合并它们

PS:这不是实际的dict,它在每个Children中有更多的嵌套键

2 个答案:

答案 0 :(得分:0)

您可以先合并两个阵列(如果我的语法错误,请更正我)

match_both = match_df.extend(match_ar)

然后你应该消除重复

match_both = list(set(match_both))

我可能非常非常错,如果我误解了这个问题,请纠正我

我用作参考:
What is the syntax to insert one list into another list in python?
Removing duplicates in lists

答案 1 :(得分:0)

为了确保我们在同一页上,我的理解是这就是你想要的。在上面的例子中,df_search()返回key1,key2和key3,因为它们都在范围[3,4]中有df而ar_search()返回key1和key3,因为它们在适当的范围内有ar。你想要什么&#34; match_both&#34;等于是key1和key3,因为它们是ar和df搜索中存在的2个键。

为了实现这一目标,我建议您按以下方式重新组织代码:创建一个接受字典的通用函数,一个字符串(&#34; ar&#34;,&#34; df&# 34;等等)以及范围([3,4],[6,7,8,9]等)并返回字典中与条件匹配的所有键的列表。例如:

def getMatchingKeys(values, s, matchRange):
    matchingKeys = []
    for key in values:
        if values[key][s] in matchRange:
        matchingKeys.append(key)
    return matchingKeys

现在,通过此功能,我们可以动态获取匹配的所有键,并使用两个单独的搜索功能完成您正在执行的操作:

match_df = getMatchingKeys(values, "df", [3,4])  # returns ["key1", "key2", "key3"]
match_ar = getMatchingKeys(values, "ar", [6,7,8,9])  # returns ["key1", "key3"]

现在,我们需要做的就是找到match_df和match_ar中包含的键。为此,我们可以将列表转换为集合并获取intersection of the two(包含在两者中的所有键):

match_both = set(match_df) & set(match_ar)

现在,如果你想添加&#34;或&#34;的限制在[1,2]中,你可以轻松地做到这一点:

match_df = getMatchingKeys(values, "df", [3,4])  # returns 
match_ar = getMatchingKeys(values, "ar", [6,7,8,9])
match_od = getMatchingKeys(values, "od", [1,2])
match_all = set(match_df) & set(match_ar) & set(match_od)

但是,最好创建一个接受约束列表的函数,并以编程方式获取与所有约束匹配的所有键:

def getKeysMatchingConstraints(values, constraints):
    keys = None
    for (s, matchRange) in constraints:
       result = getMatchingKeys(values, s, matchRange)
       if keys == None: keys = set(result)
       else: keys = keys & set(result)
    return keys

getKetsMatchingConstraints(values, [("df", [3,4]), ("ar", [6,7,8,9]), ("od", [1,2])])