лямбда в лямбда - PullRequest
       2

лямбда в лямбда

0 голосов
/ 16 марта 2019

Может кто-нибудь объяснить мне, что я здесь не так делаю -

multiArray = [
    ['one', 'two', 'three', 'four', 'five'],
    ['one', 'two', 'three', 'four', 'five'],
    ['one', 'two', 'three', 'four', 'five']
]
search ='four'
p1 = list(filter(lambda outerEle: search == outerEle, multiArray[0]))
p = list(filter(lambda multiArrayEle: list(filter(lambda innerArrayEle: search == innerArrayEle, multiArrayEle)), multiArray))
print (p1)
print (p)

Результат, который я получаю здесь:

['four']
[['one', 'two', 'three', 'four', 'five'], ['one', 'two', 'three', 'four', 'five'], ['one', 'two', 'three', 'four', 'five']]

пока я ожидаю

[['four'],['four'],['four']]

Ответы [ 2 ]

4 голосов
/ 16 марта 2019

Во втором filter вы используете list в качестве предиката (в отличие от bool, как в первом filter);теперь это неявно применяет встроенный метод bool к каждому элементу list, а для списка l, bool(l) истинно именно тогда, когда l непусто:

In [4]: bool([])
Out[4]: False

In [5]: bool(['a'])
Out[5]: True

Это позволяет вам выбирать, например, все непустые списки в списке списков:

In [6]: ls = [['a'], [], ['b']]

In [7]: list(filter(lambda l: l, ls))
Out[7]: [['a'], ['b']]

Таким образом, в вашем случае, в конце дня, ваш filterзаканчивается тем, что дает вам все списки, для которых появляется 'four', и это все они.

Из вашего приведенного примера не сразу очевидно, чего вы пытаетесь достичь, так как все входные данные идентичны, но я думаю,это что-то вроде следующего:

In [19]: multiArray = [
    ...:     ['one', 'two', 'three', 'four', 'five', 'four'],
    ...:     ['one', 'two', 'three', 'for', 'five'],
    ...:     ['one', 'two', 'three', 'four', 'five']
    ...: ]

In [20]: [list(filter(lambda x: x == search, l)) for l in multiArray]
Out[20]: [['four', 'four'], [], ['four']]
3 голосов
/ 16 марта 2019

Хотя ответ @ fuglede действительно является ответом на ваш вопрос, вы можете заархивировать желаемый результат, изменив внешний filter на map:

p = list(map(lambda multiArrayEle: list(filter(lambda innerArrayEle: search == innerArrayEle, multiArrayEle)), multiArray))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...