簡體   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