2017-03-22 44 views
1

這個問題來自基本數據類型的hackerrank問題。當我運行爲什麼Python 3中的地圖對象需要轉換爲列表才能理解?

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但是,如果我第一次投的將對象映射到列表我得到正確的答案5.這更令人困惑,因爲當我用

替換打印參數時

它給出了6的正確答案,所以清楚地說最大的作品,但我猜測列表中的某些東西由於某種原因在地圖對象上斷裂。這是特別的事實,如果我做

print([x for x in arr if x < max(arr)]) 

我得到2與其它不太有序列表更多的測試顯示,最後一條語句似乎總是返回列表(ARR)支持[0],所以最終我期待問題在於地圖對象上的列表理解。所以最終我想知道的是

  • Python 3.5.x如何處理導致失敗的地圖對象和列表解析?
  • 有沒有什麼方法可以以一種直接的方式成功處理地圖對象,並且不需要執行轉換?

回答

4

在Python 3中的返回值map不是一個列表,而是一個可迭代的對象。它可以很容易地變成一個列表,但如果直接使用它,則不能迭代多次。如果您爲了計算max而迭代一次,那麼您已經使用了它,並且不會再獲取所有項目。

在Python 2中,map爲您建立了一個列表,所以您沒有得到懶惰地評估其中的項目的選項。在Python 3中,您可以將它傳遞給list函數以獲取列表。

+0

好的,這是有道理的,所以基本上列表數據類型允許多次迭代。我做了一些測試與其他迭代操作,如理解沒有最大值,它似乎撐起了。謝謝你的時間! (一旦時間鎖定結束,我會接受) –

1

在Python 3中,map爲您提供iterator。所以arr給你數字2,3,6,6和5 一次。當你做[x for x in arr if x < max(arr)]))時,for x in arr詢問arr其下一個元素,即2,並將其分配給x。然後max(arr)越過剩餘的數字(3,6,6和5)並返回最大值,即6。由於2小於6,它最終會出現在您的結果中。然後for x in arr再次,並且因爲arr已經經歷了一切,我們完成了。所以這就是爲什麼你的結果是[2]

不過,對於始終包含第一個元素的列表,您錯了。例如,如果輸入4 3 2 1,則生成的列表是空的(因爲4不小於最大值3,2和1)。

+0

太棒了。我很欣賞增加的信息! –

相關問題