繁体   English   中英

为什么Python 3中的map对象需要转换为列表才能具有理解功能?

[英]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.5.x如何处理导致失败的地图对象和列表推导?
  • 有什么方法可以以不涉及转换的理解直接地成功处理地图对象?

Python 3中map的返回值不是列表,而是一个可迭代的对象。 可以轻松地将其转换为列表,但是如果直接使用它,则不能多次迭代。 如果对它进行一次迭代以便计算出max ,则说明它已经用完,并且不会再得到所有项目。

在Python 2中, map为您构建了一个列表,因此您没有选择延迟评估其中的项目。 在Python 3中,您可以将其传递给list函数以获取列表。

在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 arrfor x in arr再次出现,由于arr已经经历了所有事情,所以我们完成了。 这就是为什么您的结果是[2]

但是,您对于总是包含第一个元素的列表是错误的。 例如,如果输入4 3 2 1 ,则结果列表为 (因为4不小于3、2和1的最大值)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM