在python中的子列表上使用map和filter函数

时间:2017-12-10 22:54:56

标签: python lambda

L = [[5, 0, 6], [7, 22], [0, 4, 2], [9, 0, 45, 17]]

我确实有这个列表,我的任务是删除0。我必须同时使用map()filter()函数。

提示是使用map,filter和lambda表达式可以使用单个表达式解决此任务。

我一直试图解决这个问题很长一段时间,但我只是不明白。你不必完全解决它,但是将不胜感激。

我假设我使用map()迭代外部列表,但如何使用子列表调用filter()

L2 = map(lambda x: filter(lambda x: x<>0 ,L),L)

4 个答案:

答案 0 :(得分:2)

使用mapfilter,您可以编写以下内容

>>> list(map(lambda i: list(filter(lambda i: i != 0, i)), L))
[[5, 6], [7, 22], [4, 2], [9, 45, 17]]

对于它的价值,我更喜欢嵌套列表理解

>>> [[i for i in j if i != 0] for j in L]
[[5, 6], [7, 22], [4, 2], [9, 45, 17]]

答案 1 :(得分:1)

您可以使用以下事实:如果filter()的第一个参数是None,那么只有那些&#34; true&#34;将保留。 0被视为false,因此将删除0。

解决方案可以这样写:

>>> L = [[5, 0, 6], [7, 22], [0, 4, 2], [9, 0, 45, 17]]
>>> map(lambda l: filter(None, l), L)
[[5, 6], [7, 22], [4, 2], [9, 45, 17]]

如果您使用的是Python 3,那么您可以在list()filter()的结果上调用map()来获取所需的列表:

>>> map(lambda l: filter(None, l), L)
<map object at 0x7fb34856be80>
>>> list(map(lambda l: list(filter(None, l)), L))
[[5, 6], [7, 22], [4, 2], [9, 45, 17]]

现在可读性降低了。列表理解可能更好。

>>> [[item for item in l if item] for l in L]
[[5, 6], [7, 22], [4, 2], [9, 45, 17]]

答案 2 :(得分:1)

我的关键是考虑类型,这在Python中是一个有点外国的概念。

map接受一个函数和一个iterable,并返回一个iterable,它是将该函数应用于iterable参数的每个元素的结果。

map(f: "some function",
    lst: "some iterable") -> "(f(e) for e in lst)"

在这种情况下,外部列表的元素本身就是列表!而且您计划将filter函数应用于每个函数以删除零。 filter期望一个函数(它本身需要一个元素,如果该元素应该在结果中,则返回True,如果应该删除它,则返回False)以及这些元素的列表。

filter(f: "some_func(e: 'type A') -> Bool",
       lst: "some_iterable containing elements of type A") ->
       "(e for e in lst if f(e))":

您的filter功能只是filter(lambda x: x != 0, some_list)lambda sublst: filter(lambda x: x!=0, sublst)。将其应用于map,您将获得:

map(lambda sublst: filter(lambda x: x!=0, sublst), lst)

[[x for x in xs if x!=0] xs in xss]

这更容易在Haskell中表达,它更自然地处理mapfilter

map (filter (/=0)) lst
-- or still with a list comprehension
[[x | x <- xs, x!=0] | xs <- xss]

答案 3 :(得分:0)

您可以在过滤器函数中使用None参数并执行类似

的操作

[list(filter(None, i)) for i in a]