IrfanRaza
IrfanRaza

Reputation: 3058

lambda in lambda

Can anybody explain me whats wrong i am doing here -

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)

The result i am getting here is

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

while i am expecting

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

Upvotes: 0

Views: 77

Answers (2)

Bohdan Kaminskyi
Bohdan Kaminskyi

Reputation: 144

While @fuglede's answer is really the answer to your question, you can archive the result you want by changing your outer filter to map:

p = list(map(lambda multiArrayEle: list(filter(lambda innerArrayEle: search == innerArrayEle, multiArrayEle)), multiArray))

Upvotes: 3

fuglede
fuglede

Reputation: 18201

In your second filter, you are using a list as a predicate (as opposed to simply a bool as you do in the first filter); now, this implicitly applies the built-in method bool to each element list, and for a list l, bool(l) is true exactly when l is non-empty:

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

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

This allows you to pick out, for example, all the non-empty lists in a list of lists:

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

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

Thus, in your case, at the end of the day, your filter ends up giving you all lists for which 'four' appears, which is all of them.

From your given example, it's not immediately obvious what you are trying to achieve as all the inputs are identical, but my guess is that it's something like the following:

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

Upvotes: 4

Related Questions