如何将参数传递给lambdas列表?

时间:2016-10-17 05:44:28

标签: python lambda filtering list-comprehension

意图:我正在尝试返回包含字典列表中传递的匹配关键字和值的每个字典。例如,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'))

3 个答案:

答案 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'))

更多问题,然后让我知道。