【问题标题】:How to pass arguments to a function in "map" function call?如何在“map”函数调用中将参数传递给函数?
【发布时间】:2019-04-15 13:11:51
【问题描述】:

我知道 map 函数获取一个函数作为它的第一个参数,而下一个参数是迭代器,需要在其上应用传递的函数。我的问题是说我是否有这样的二维列表

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

如何以相反的顺序对单个列表进行排序,以便我的输出是

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

我知道一个潜在的解决方案是使用 lambda 函数,例如

list(map(lambda x:x[::-1],l))

我想要这样的东西

list(map(sorted, l,'reversed=True'))

其中 'reversed=True' 是排序后的参数

例如:

>>> newList=[1,2,3]
>>> sorted(newList,reversed='True')
>>> [3,2,1]

我已经看到如何使用 itertools.repeat 模块将参数传递给 pow 函数

map(pow,list,itertools.repeat(x))

x=列表必须提升到的幂

我想知道是否有任何方法可以在映射函数中传递参数。在我的情况下,排序函数的“reverse=True”。

【问题讨论】:

  • 我相信您使用 lambda 的解决方案是您应该喜欢的解决方案。

标签: python python-3.x


【解决方案1】:

您可以为此使用functools.partial

import functools

new_list = list(map(functools.partial(sorted, reverse=True), l))

【讨论】:

  • 我要发布这个,因为这是要走的路。但是写了另一个选项,因为你是第一个;)
  • functools.partial 是 python 的柯里化函数方式。
  • @TheNamesAlc 是的,这正是它的工作原理,您可以从文档中了解更多信息:docs.python.org/3/library/functools.html#functools.partial
【解决方案2】:

您可以使用lambda 来包装函数:

map(lambda x: sorted(x, reversed=True), l)

或:

map(lambda i, j: pow(i, j), list,itertools.repeat(x))

【讨论】:

  • Lambda 允许你做什么。
【解决方案3】:

有很多方法可以做到这一点。

您可以使用functools.partial。它创建了一个partial,因为没有更好的词,你传递给它的函数。它有点像创建了一个新函数,其中已经传递了一些参数。

对于您的示例,它将是:

from functools import partial
rev_sort = partial(sorted, reverse=True)
map(rev_sort, l)

另一种方法是使用简单的 lambda:

map(lambda arr: sorted(arr, reverse=True), l)

另一种方式(我个人的选择)是使用生成器:

(sorted(arr, reverse=True) for arr in l)

【讨论】:

  • 你是对的。 2和3在技术上是相同的。他们都被懒惰地评估了。据我所知,唯一的区别是语法。我更喜欢第三个,因为对我来说,它更容易理解。
【解决方案4】:

对于这种特定情况,您还可以使用列表推导式 -

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

l = [list(reversed(sublist)) for sublist in l] //[[3,2,1],[6,5,4],[9,8,7]]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-19
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多