лямбда-выражение python с динамическими полями - PullRequest
0 голосов
/ 24 августа 2018

У меня есть список словарей.Я хочу иметь возможность фильтровать этот список с динамическим списком полей.Итак,

my_list = [{'a': 1, 'b': 1, 'c': 1}, {'a': 1, 'b': 1, 'c': 2}, {'a': 1, 'b': 2, 'c': 2}]
reference_row = {'a': 1, 'b': 1, 'c': 1}

compare_fields = ['a'] # Compares only field 'a' of reference row with rows in my_list 
# Magical filter expression results in [{'a': 1, 'b': 1, 'c': 1}, {'a': 1, 'b': 1, 'c': 2}, {'a': 1, 'b': 2, 'c': 2}]

compare_fields = ['a', 'b'] # Compares fields 'a' and 'b' of reference row with rows in my_list 
# Magical filter expression results in [{'a': 1, 'b': 1, 'c': 1}, {'a': 1, 'b': 1, 'c': 2}]

compare_fields = ['a', 'b', 'c'] # Compares fields 'a', 'b' and 'c' of reference row with rows in my_list 
# Magical filter expression results in [{'a': 1, 'b': 1, 'c': 1}]

Я пробовал что-то вроде следующего, но это не сработало:

list(filter(lambda d: (d[field] == reference_row[field] for field in compare_fields ), my_list))

Я не хочу просматривать элементы в Compare_fields и фильтровать по одномуполе в каждой итерации.Любой изящный способ сделать это?

1 Ответ

0 голосов
/ 24 августа 2018

Вам нужна функция all, которая имеет значение true, если каждый элемент итерируемого равен True. В противном случае каждый вход в ваш фильтр возвращал True.

list(filter(lambda d: all(d[field] == reference_row[field] for field in compare_fields), my_list))

Я думаю, что это немного чище

[d for d in my_list if 
 all(d[field] == reference_row[field] for field in compare_fields)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...