2015-12-01 3 views
-6
arr = [[2,6,8],[1,4,7],[3,3,4],[2,4,9],[3,3,7]] 

array_analysis = lambda arr=[], evenOdd=True, no_doubles= True:list(i for i in arr if evenOdd == True len(set(i) % 2) if no_doubles == True len(set(i) !> 1) 

# test it 
print('test array', arr) 
for evenOdd, no_doubles in ((True, True), (True, False), (False, True), (False, False)): 
    print(evenOdd, no_doubles, array_analysis(arr, evenOdd, no_doubles)) 

Я пытаюсь создать функцию лямбда, которая будет фильтровать список массивов на основе условных аргументов.Список фильтров с сложным выражением

  • Если все аргументы лямбды являются True, возвращаемое значение должно быть: [[1,4,7],[2,4,9]] потому нет всех нечетных или все сглаживает не двойники в количестве не установлены.

  • Если no_doubles - False, то он должен включать в себя парные разряды, у которых нет всех четных или вообще не имеющих шансов. Возвращаемое значение должно быть [[1,4,7],[2,4,9],[3,3,4]] не включает в себя набор [3,3,7], потому что все странно.

  • Если oddEven is False и no_double является ложным, возвращаемым значением должно быть все номера наоборот. Если oddEven является False и no_double является True, возвращаемое значение должно быть [[3,3,4],[3,3,7]]

без лямбда

# filters all odd or all even 
def oddEven(a): 
    return [i for i in a if len(set(np.mod(i, 2)))!=2] 

# filters doubles 
def no_doubles(a): 
    return [i for i in a if len(set(i))!>2] 

def all_filters_combined(a): 
    return oddEven(a) and no_doubles(a) 

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

+1

Пожалуйста, правильно отформатируйте свой код, это нечитаемо и неоднозначно. – deceze

+2

Во-первых, почему вы настаиваете на том, чтобы он был «лямбдой»? – bereal

+0

Я потерял ... вы можете показать желаемый результат для всех четырех комбинаций evenOdd и no_doubles True и False? – elzell

ответ

1

Я считаю, что это делает то, что вы хотите ...

arr = [[2,6,8],[1,4,7],[3,3,4],[2,4,9],[3,3,7]] 

foo = lambda arr, evenOdd, noDoubles: [ i for i in arr if not (evenOdd and (all(k % 2 == 1 for k in i) or all(k%2 == 0 for k in i))) and not (noDoubles and (len(i) != len(set(i))))] 

print(foo(arr, False, False)) 
print(foo(arr, True, False)) 
print(foo(arr, False, True)) 
print(foo(arr, True, True)) 

$ python3 foo.py 
[[2, 6, 8], [1, 4, 7], [3, 3, 4], [2, 4, 9], [3, 3, 7]] 
[[1, 4, 7], [3, 3, 4], [2, 4, 9]] 
[[2, 6, 8], [1, 4, 7], [2, 4, 9]] 
[[1, 4, 7], [2, 4, 9]] 
$ 

Давайте разбить его немного.

[ i for i in arr if ... ] - Вы можете использовать списки, чтобы сделать фильтрацию следующим образом. Нам просто нужно убедиться, что ... оценивает True или False правильно в зависимости от элемента.

not (evenOdd and (all(k % 2 == 1 for k in i) or all(k%2 == 0 for k in i))) - Это тест evenOdd. Если evenOdd - False, тогда инструкция будет замыкаться на True, то есть элемент не должен быть отфильтрован. Если evenOdd - True, тогда all(k % 2 == 1 for k in i) проверяет, не является ли каждый элемент i (и следующий тест проверяется на четность).

and - Если какой-либо из тестов не прошел, элемент должен быть отфильтрован.

not (noDoubles and (len(i) != len(set(i)))) - Если noDoubles is False, тогда выражение коротких замыканий на True. Если noDoubles - True, то len(i) != len(set(i))) - это просто грязное испытание для дубликатов.

+0

Огромное вам спасибо, True True ничего не возвращает. В настоящее время я настраиваю его, чтобы он работал. Я действительно ценю вашу помощь. – QuantumTraveler

+0

'True, True' * должен * возвращать' [[1, 4, 7], [2, 4, 9]] '. Мой пример кода включал запуск программы с этим результатом. – QuestionC

+0

Пожалуйста, не забудьте принять мой вопрос с чеком, если он исправил вашу проблему. – QuestionC

Смежные вопросы