我正在尝试用一个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)
正如Willem Van Onsem在评论中所说,
map
在python3中是懒惰的。与Python 2中的情况不同,map
将返回一个生成器,而不是像Python 2那样立即将该函数应用于所有项并返回一个生成器,而您需要迭代该生成器才能实际执行转换:如您所见,该函数不运行,
^{pr2}$res
是一些“映射对象”(即映射生成器)。为了实际生成值并调用函数,我们必须首先迭代此生成器:如果您想取回一个列表,还可以在结果上调用
list()
,立即为每个元素调用函数:但是请注意,您的案例并不适合
map
。据我所知,从您的代码和您的输入中,您输入的第一行是一个单独的数字,它包含了后面需要处理的行数。在所以在您的例子中,除非您想主动忽略第一行(只处理每一行),否则您不应该在这里使用
map
。在但是,通过存储这些
split
调用的结果,可以使代码更简单(也更高效)。例如:在这里,您只需将输入拆分一次,而不是每次迭代一次。在
至于您的
inBetween
函数,您也可以在这里使用for循环,这使它更简单:最后,这里的} 这看起来真的很不错:
inBetween
函数实际上没有任何好处。因为它是变异的全局状态(即hours
字典),所以在它的确切上下文之外它并没有真正的用处,所以您可以在这里简单地内联功能。然后甚至可以提取逻辑,这样就可以得到一个只处理输入并返回hours
字典的函数。再加上^{这已经是一切了:
相关问题 更多 >
编程相关推荐