[英]Why list comprehension with map() function in python can return None
[英]Why does the map object in Python 3 need to be cast to a list to function with comprehension?
这个问题来自基本数据类型的hackerrank问题。 当我跑步
max(map(int, range(5)))
我得到正确的输出4,但是当我这样做时
if __name__ == '__main__':
n = int(input()) #this line seems irrelevant to my question, but it was present in the original question so I have included it here for completeness
arr = map(int, input().split())
print(max([x for x in arr if x < max(arr)]))
并输入
5
2 3 6 6 5
结果是2。但是,如果我首先将map对象转换为列表,则会得到正确的答案5。这进一步令人困惑,因为当我将print参数替换为
print(max(arr))
它给出正确的答案6,因此max显然很有效,但是由于某种原因,我猜测列表对象中的某些理解会中断。 如果我这样做,这一点尤其得到支持
print([x for x in arr if x < max(arr)])
我得到2。使用其他排序较少的列表进行的更多测试表明,最后一条语句似乎总是返回list(arr)[0],因此最终我希望问题出在对地图对象的列表理解上。 所以最终我想知道的是
在Python 3中, map
提供了一个迭代器 。 所以arr
为您提供了数字2,3,6,6和5 次 。 当你[x for x in arr if x < max(arr)]))
将for x in arr
要求arr
为它的下一个元件,它是2
,并且分配该至x
。 然后, max(arr)
遍历其余的数字max(arr)
和5)并返回最大值,即6
。 由于2
小于6
,因此最终得到结果。 然后for x in arr
的for x in arr
再次出现,由于arr
已经经历了所有事情,所以我们完成了。 这就是为什么您的结果是[2]
。
但是,您对于总是包含第一个元素的列表是错误的。 例如,如果输入4 3 2 1
,则结果列表为空 (因为4
不小于3、2和1的最大值)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.