![](/img/trans.png)
[英]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.