正如威廉·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 }
這是因爲,'map'在python-3.x的工作*懶*,用'名單兌現它(地圖(..))' –