用地图替换循环

时间:2017-04-09 10:10:31

标签: python

我正在尝试用map函数替换下面的for循环, 我认为它必须像map(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 个答案:

答案 0 :(得分:2)

正如Willem Van Onsem在评论中所说,map在Python 3中是懒惰的。而不是立即将函数应用于所有项目并返回列表,如Python 2中的情况,{{1} }将返回一个生成器,您需要迭代它以实际执行转换:

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]) 函数,你也可以在这里使用for循环,这样可以更简单:

inBetween

最后,您的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这实际上看起来很不错:

hours

这已经是一切:

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)