我是一个python新手,尝试实现以下目标:
我有一个列表:
lst = [[567,345,234],[253,465,756, 2345],[333,777,111, 555]]
我希望将lst映射到另一个列表中,该列表只包含每个子列表中第二个最小的数字。所以结果应该是:
[345, 465, 333]
例如,如果我只对最小的数字感兴趣,我可以:
map(lambda x: min(x),lst)
我希望我能做到:
map(lambda x: sort(x)[1],lst)
但排序不连锁。(不返回)
也不允许这样:
map(lambda x: sort(x); x[1],lst) #hence the multiple statement question
在python中,有没有一种方法可以在不定义命名函数的情况下使用map而来实现这一点?(例如,在ruby中使用匿名块很容易)
时间旅行者。如果您通常希望在lambda中有多个语句,则可以将其他lambda作为参数传递给该lambda。
实际上不能有多个语句,但是可以通过将lambdas传递给lambdas来模拟。
编辑:时间旅行者返回!您还可以滥用布尔表达式的行为(记住短路规则和真实性)来链接操作。使用三元运算符可以提供更大的功率。同样,不能有多个语句,但当然可以有多个函数调用。这个例子对一堆数据做了一些任意的垃圾处理,但是,它表明你可以做一些有趣的事情。print语句是返回
None
(和.sort()
方法一样)的函数示例,但它们也有助于显示lambda
正在做什么。将语句放入列表中可能会模拟多个语句:
例如:
我可以在这里给出几个不同的答案,从你的具体问题到更普遍的问题。所以从最具体到最一般:
Q.你能在lambda中放入多个语句吗?
A.不需要。但实际上不需要使用lambda。您可以将语句放在
def
中。即:Q.你能通过对列表进行排序从lambda中得到第二低的项吗?
A.是。正如alex's answer所指出的,
sorted()
是sort的一个版本,它创建了一个新列表,而不是就地排序,并且可以被链接。请注意,这可能是您应该使用的-这是不好的做法,您的地图有副作用的原始名单。Q.如何从一系列列表中的每个列表中获取第二个最低的项。
A.
sorted(l)[1]
实际上不是最好的方法。当存在O(N)解时,它具有O(N log(N))复杂性。这可以在heapq模块中找到。所以只要使用:
通常还认为使用列表理解更清楚,这样可以完全避免lambda:
相关问题 更多 >
编程相关推荐