我有类似的代码
{
'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'],
}
}
如何使用给定类型的代码以小而好的代码实现此输出。
答案 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']}}