Как передать аргумент в список lambdas?

Цель: я пытаюсь вернуть каждый словарь, содержащий переданные в соответствующих словах и значениях в списке словарей. Например, a='woot', e='1', c='duh'вернется только

{'a': 'woot', 'b': 'nope', 'c': 'duh', 'd': 'rough', 'e': '1'}

Это то, что у меня есть до сих пор, но я не знаю, как передать аргумент списку лямбда-выражения, которые действуют как фильтр для каждого словаря в списке.

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

python,lambda,filtering,list-comprehension,

0

Ответов: 3


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()])]    

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'}]

0

Я думаю, что вам не нужно использовать лямбда здесь ... для петли достаточно ...

Концепция проста: следующее: если все ключи и значения в параметре принадлежат и равны значению 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'))

Еще вопрос, тогда дайте мне знать.

питон, лямбда, фильтрация, список постижение,
Похожие вопросы