使用map获取元组中最小的正数

时间:2014-04-10 15:12:10

标签: python

x = (1,1,-13,8,5,0,4,-1,-4)


z = map(lambda x: min(x) >=0 , x)

为什么当我尝试print(z)我没有得到1?

2 个答案:

答案 0 :(得分:3)

您的代码无效,因为lambda x会获取原始元组的各个项目,并且您将它们传递给min。这就是它失败的原因。您可以像这样修复您的程序

print min(filter(lambda i: i >= 0, x))
# 1

我们正在使用生成器表达式执行相同的操作,例如

x = (1, 1, -13, 8, 5, 0, 4, -1, -4)
print min(item for item in x if item > 0)
# 1

如果您将0也视为正数,则

print min(item for item in x if item >= 0)
# 0

注意:如果没有任何元素为正数或x为空,则会抛出错误。

答案 1 :(得分:1)

  

为什么我尝试print(z)时我没有1

如果您有以下代码:

z = map(lambda x: min(x) >=0 , x) # <-- exception 
#                   ^^^^^ 
print(z)

然后我怀疑控制是否达到了打印声明。你必须在我在上面提到的代码中作为注释获得异常。在我的机器上查看它的执行情况:

>>> x = (1, 1, -13, 8, 5, 0, 4, -1, -4)
>>> z = map(lambda x: min(x) >= 0, x)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>  # <--- First
TypeError: 'int' object is not iterable  # <--- Second

请注意错误消息。我标记了第一个&#39;,异常消息说您在lambda表达式中遇到异常。 &#39;其次&#39;我标记的行意味着异常是TypeError!

  

为什么键入错误?

因为您在lambda表达式中向min( )函数传递了错误的参数。检查Python documentation for min()。函数min( )可以通过以下两种方式调用:

>>> min(1, 2) # First: Multiple arguments  
1
>>> min([-1, 2, 3]) # Second: pass an iterator 
-1
>>> min([3]) # Infact you can pass iterator of single element, that will work
3

但你怎么称呼如下:

>>> min(3)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'int' object is not iterable  # <---
>>> 

现在再次注意异常消息,它与我们在&#34; TypeError&#34;上方的代码段中遇到的相同。

map( )函数中,lambda表达式中的参数x是本地的,恰好是int类型(x的第二个参数map( )是整合的集合)。您还应该仔细阅读文档中的map(function, iterable, ...)函数。在你的代码中,iterable是元组x,函数是你的lambda表达式。在第一步,使用x[0] 1调用lambda函数,这样就可以在lambda表达式中有效调用min(1)并导致TypeError异常。