意图:我正在尝试返回包含字典列表中传递的匹配关键字和值的每个字典。例如,a='woot', e='1', c='duh'
仅返回
{'a': 'woot', 'b': 'nope', 'c': 'duh', 'd': 'rough', 'e': '1'}
这是我到目前为止所做的,但我不知道如何将参数传递给lambda表达式列表,该列表充当列表中每个字典的过滤器。
sample_dict = [
{'a': 'woot', 'b': 'nope', 'c': 'duh', 'd': 'rough', 'e': '1'},
{'a': 'coot', 'b': 'nope', 'c': 'ruh', 'd': 'rough', 'e': '2'},
{'a': 'doot', 'b': 'nope', 'c': 'suh', 'd': 'rough', 'e': '3'},
{'a': 'soot', 'b': 'nope', 'c': 'fuh', 'd': 'rough', 'e': '4'},
{'a': 'toot', 'b': 'nope', 'c': 'cuh', 'd': 'rough', 'e': '1'}
]
def get_matched_lines(input_dict, **param):
filters = [lambda input_dict_elem,
input_key=param_key,
input_value=param_value:
input_dict_elem[input_key] == input_value
for param_key, param_value in param.items()]
return [dict_elem for dict_elem in input_dict if(all(filters))]
print(get_matched_lines(sample_dict, a='woot', e='1', c='duh'))
答案 0 :(得分:3)
你可以这样做(在Python 2.7中):
def get_matched_lines(input_dict, **param):
return [dic for dic in input_dict if all([key in dic and dic[key] == val for key, val in param.iteritems()])]
Python 3中的相同代码是
def get_matched_lines(input_dict, **param):
return [dic for dic in input_dict if all([key in dic and dic[key] == val for key, val in param.items()])]
答案 1 :(得分:0)
def get_matched_lines(input_dict, array):
output=[]
keys=[]
values=[]
for a in array:
keyvalue = a.split("=")
keys.append(keyvalue[0])
values.append(keyvalue[1])
for dict in input_dict:
bool=1
for i in range(0,len(keys)):
if keys[i] in dict.keys():
# print values[i]
if dict[keys[i]] != values[i]:
bool=0
if bool==1:
output.append(dict)
return output
sample_dict = [
{'a': 'woot', 'b': 'nope', 'c': 'duh', 'd': 'rough', 'e': '1'},
{'a': 'coot', 'b': 'nope', 'c': 'ruh', 'd': 'rough', 'e': '2'},
{'a': 'doot', 'b': 'nope', 'c': 'suh', 'd': 'rough', 'e': '3'},
{'a': 'soot', 'b': 'nope', 'c': 'fuh', 'd': 'rough', 'e': '4'},
{'a': 'toot', 'b': 'nope', 'c': 'cuh', 'd': 'rough', 'e': '1'}
]
array = ["a=woot", "e=1", "c=duh"]
print get_matched_lines(sample_dict, array)
输出:
[{'a': 'woot', 'c': 'duh', 'b': 'nope', 'e': '1', 'd': 'rough'}]
答案 2 :(得分:0)
我认为你不必在这里使用lambda ...基本的循环就足够了......
概念很简单如下: 如果param中的所有键和值都属于input_dict,则返回要返回的整个字典行。如果至少找不到某个键或者值不相同,则不返回任何内容。
sample_dict = [
{'a': 'woot', 'b': 'nope', 'c': 'duh', 'd': 'rough', 'e': '1'},
{'a': 'coot', 'b': 'nope', 'c': 'ruh', 'd': 'rough', 'e': '2'},
{'a': 'doot', 'b': 'nope', 'c': 'suh', 'd': 'rough', 'e': '3'},
{'a': 'soot', 'b': 'nope', 'c': 'fuh', 'd': 'rough', 'e': '4'},
{'a': 'toot', 'b': 'nope', 'c': 'cuh', 'd': 'rough', 'e': '1'}
]
def get_matched_lines(input_dict, **param):
return [d_ for d_ in sample_dict if all([False for k in param if not k in d_ or d_[k]!=param[k]])]
print(get_matched_lines(sample_dict, a='woot', e='1', c='duh'))
更多问题,然后让我知道。