仅获取包含特定字符串值的字典中的那些部分

时间:2016-05-26 09:47:32

标签: python dictionary

我有类似的代码

{
    'global': 
    {
        'www.test1.com': ['x', 'y'],
        'www.test2.com': ['x', 'y'],
        'www.test3.com': ['x'],
        'www.test4.com': ['x', 'y'],
        'www.test5.com': ['x']
    },
    'private': 
    {
        'www.test6.com': ['m', 'n'],
        'www.test7.com': ['n'],
        'www.test8.com': ['m']
    }
}

我想要的输出是这样的:

{
    'private': 
    {
        'www.test6.com': ['m', 'n'],
         'www.test7.com': ['n'],
    }
}

基于' n'我必须实现上述输出。 基本上在哪里' n'在场,我必须展示那一部分。如果' n'在全球范围内有'部分我也需要获取特定的组合。

喜欢

输入:

{
    'global': 
    {
        'www.test1.com': ['x', 'n'],
        'www.test2.com': ['x', 'y'],
        'www.test3.com': ['x'],
        'www.test4.com': ['x', 'y'],
        'www.test5.com': ['n']
    },
    'private': 
    {
        'www.test6.com': ['m', 'n'],
        'www.test7.com': ['n'],
        'www.test8.com': ['m']
    }
}

然后输出应该是:

{
    'global': 
    {
        'www.test1.com': ['x', 'n'],
         'www.test5.com': ['n']
    },
    'private': 
    {
        'www.test6.com': ['m', 'n'],
         'www.test7.com': ['n'],
    }
}

如何使用给定类型的代码以小而好的代码实现此输出。

4 个答案:

答案 0 :(得分:1)

使用字典理解:

>>> new_d={key:dict(filter(lambda x:'n' in x[1], value.items())) for key, value in d.items() if dict(filter(lambda x:'n' in x[1], value.items()))}

样品运行:

>>> d={
...     'global': 
...     {
...         'www.test1.com': ['x', 'n'],
...         'www.test2.com': ['x', 'y'],
...         'www.test3.com': ['x'],
...         'www.test4.com': ['x', 'y'],
...         'www.test5.com': ['n']
...     },
...     'private': 
...     {
...         'www.test6.com': ['m', 'n'],
...         'www.test7.com': ['n'],
...         'www.test8.com': ['m']
...     }
... }
>>> new_d={key:dict(filter(lambda x:'n' in x[1], value.items())) for key, value in d.items() if dict(filter(lambda x:'n' in x[1], value.items()))}
>>> new_d
{'global': {'www.test5.com': ['n'], 'www.test1.com': ['x', 'n']}, 'private': {'www.test6.com': ['m', 'n'], 'www.test7.com': ['n']}}

在第一个例子中运行相同的代码:

>>> d={
...     'global': 
...     {
...         'www.test1.com': ['x', 'y'],
...         'www.test2.com': ['x', 'y'],
...         'www.test3.com': ['x'],
...         'www.test4.com': ['x', 'y'],
...         'www.test5.com': ['x']
...     },
...     'private': 
...     {
...         'www.test6.com': ['m', 'n'],
...         'www.test7.com': ['n'],
...         'www.test8.com': ['m']
...     }
... }
>>> new_d={key:dict(filter(lambda x:'n' in x[1], value.items())) for key, value in d.items() if dict(filter(lambda x:'n' in x[1], value.items()))}
>>> new_d
{'private': {'www.test6.com': ['m', 'n'], 'www.test7.com': ['n']}}

答案 1 :(得分:0)

您可以使用以下方法在每个列表中搜索“n”:

a = {
    'global': 
    {
        'www.test1.com': ['x', 'n'],
        'www.test2.com': ['x', 'y'],
        'www.test3.com': ['x'],
        'www.test4.com': ['x', 'y'],
        'www.test5.com': ['n']
    },
    'private': 
    {
        'www.test6.com': ['m', 'n'],
        'www.test7.com': ['n'],
        'www.test8.com': ['m']
    }
}

b = {'global': {}, 'private': {}}

for i, j in a.items():
    for k, l in j.items():
        if 'n' in l:
            b[i][k] = l

finalDict = {i:j for i,j in b.items() if j} # To remove empty key/values

或使用词典理解:

a = {
    'global': 
    {
        'www.test1.com': ['x', 'n'],
        'www.test2.com': ['x', 'y'],
        'www.test3.com': ['x'],
        'www.test4.com': ['x', 'y'],
        'www.test5.com': ['n']
    },
    'private': 
    {
        'www.test6.com': ['m', 'n'],
        'www.test7.com': ['n'],
        'www.test8.com': ['m']
    }
}

b = {'global': {i:j for i,j in a['global'].items() if 'n' in j}, 'private': {i:j for i,j in a['private'].items() if 'n' in j}}

finalDict = {i:j for i,j in b.items() if j} # To remove empty key/values

答案 2 :(得分:0)

您可以尝试使用defaultdicts,它适用于这两个示例。

    from collections import defaultdict

    d = {
        'global': 
        {
            'www.test1.com': ['x', 'y'],
            'www.test2.com': ['x', 'y'],
            'www.test3.com': ['x'],
            'www.test4.com': ['x', 'y'],
            'www.test5.com': ['x']
        },
        'private': 
        {
            'www.test6.com': ['m', 'n'],
            'www.test7.com': ['n'],
            'www.test8.com': ['m']
        }
    }

    def n_finder(d):

        my_dict = defaultdict(dict)

        for key, value in d.items():
            for val in value:
                if "n" in value[val]:
                    my_dict[key][val] = value[val]

        return my_dict

    # Output

    defaultdict(<class 'dict'>, {'private': {'www.test6.com': ['m', 'n'], 'www.test7.com': ['n']}})

答案 3 :(得分:0)

如果您的dict具有静态结构,则可以像其他答案一样使用dict理解。

如果你的dict结构很复杂,你可以在这里使用我的函数:

import copy

def dict_search(src_dict, search_str):

   def rebuild_dict(original_dict, search_str):
      result_dict = copy.deepcopy(original_dict)
      for key, value in original_dict.iteritems():
         if isinstance(value, dict):
            ret_value = clean_dict(value, search_str)
            if not ret_value:
               result_dict.pop(key)
            else:
               result_dict[key] = ret_value
         elif isinstance(value, list):
            if search_str not in value:
               result_dict.pop(key)
         elif search_str != value:
            result_dict.pop(key)
      return result_dict


   if not isinstance(src_dict, dict):
      raise TypeError("src_dict must be a dict")

   return rebuild_dict(src_dict, search_str)

测试它:

a= {
    'global':
    {
        'www.test1.com': ['x', 'n'],
        'www.test2.com': ['x', 'y'],
        'www.test3.com': ['x'],
        'www.test4.com': ['x', 'y'],
        'www.test5.com': ['n']
    },
    'private':
    {
        'www.test6.com': ['m', 'n'],
        'www.test7.com': ['n'],
        'www.test8.com': ['m']
    }
}

print(dict_search(a, 'x'))

输出:

{'global': {   'www.test1.com': ['x', 'n'], 'www.test5.com':['n']},
 'private': {   'www.test6.com': ['m', 'n'], 'www.test7.com': ['n']}}