2017-04-09 75 views
0

我試圖用地圖函數替換下面的for循環, 我認爲它必須是像地圖(inBetween,input.split("\n")),但是當我這樣做時,我的小時字典保持不變。我覺得它甚至沒有進入這個功能。通過地圖替換循環

有人知道如何使它工作嗎?

#!/usr/local/bin/python3.5 

input='''5 
1 8 
2 3 
4 23 
4 6 
2 23''' 

hours = {} 
for time in range(1,25): 
    hours[time] = 0 
def inBetween(line): 
    print(line) 
    current = int(line.split(" ")[0]) 
    while current < int(line.split(" ")[1]): 
     hours[current] +=1 
     current += 1 
for entree in range(1, int(input.split("\n")[0])+1): 
     inBetween(input.split("\n")[entree]) 

print(hours) 
+1

這是因爲,'map'在python-3.x的工作*懶*,用'名單兌現它(地圖(..))' –

回答

2

正如威廉·Onsem在評論已經說了,map是懶在Python 3而不是立即應用功能,所有項目,並返回一個列表,在Python 2中的情況下,map將返回發電機,而不是你需要以遍歷實際執行轉換:

>>> lst = [1, 2, 3] 
>>> def square(x): 
     print('Calculating square of', x) 
     return x * x 

>>> res = map(square, lst) 
>>> res 
<map object at 0x0000029C2E4B2CC0> 

正如你所看到的,功能不運行,res是一些「地圖對象」,而不是(這是地圖生成器) 。我們必須以實際產生的值並調用函數首先遍歷該發生器:

>>> for x in res: 
     print(x) 

Calculating square of 1 
1 
Calculating square of 2 
4 
Calculating square of 3 
9 

如果你想要得到一個列表,用戶也可以直接撥打list()的結果立即撥打了功能每一個元素:

>>> list(map(square, lst)) 
Calculating square of 1 
Calculating square of 2 
Calculating square of 3 
[1, 4, 9] 

不過請注意,你的情況是不是真的適合map。據我所知,從您的代碼和您的輸入中可以看出,您輸入的第一行是一個包含需要處理的行數的單個數字。

所以你的情況,除非你想積極地忽略第一行(和公正的處理行),你不應該使用map這裏。

但是,通過存儲來自split調用的結果,您可以使代碼更加簡單(並且更高效)。例如:

lines = input.split('\n') 
for i in range(1, int(lines[0]) + 1): 
    inBetween(lines[i]) 

在這裏,你只是分裂一次不是一次對每個迭代的輸入。

至於你inBetween功能,你也可以使用一個for循環在這裏,這使得它簡單一點:

def inBetween(line): 
    # using a tuple unpacking to get both values from the line at once 
    start, stop = line.split(' ') 
    for h in range(int(start), int(stop)): 
     hours[h] += 1 

最後,實際上並沒有從這裏你inBetween功能任何好處。由於它是變異的全局狀態(hours字典),所以它在其確切的上下文之外並不是很有用,所以您可以簡單地在此處將功能內聯。你甚至可以提取邏輯,所以你得到一個函數,只處理輸入並返回你的字典。與defaultdict結合這實際上可以看相當不錯:

from collections import defaultdict 
def getHours(lines): 
    hours = defaultdict(int) 
    for i in range(1, int(lines[0]) + 1): 
     start, stop = lines[i].split(' ') 
     for h in range(int(start), int(stop)): 
      hours[h] += 1 
    return dict(hours) 

而這一切已經:

>>> getHours(input.split('\n')) 
{ 1: 1, 2: 3, 3: 2, 4: 4, 5: 4, 6: 3, 7: 3, 8: 2, 9: 2, 10: 2, 
11: 2, 12: 2, 13: 2, 14: 2, 15: 2, 16: 2, 17: 2, 18: 2, 19: 2, 20: 2, 
21: 2, 22: 2 }