首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用映射替换循环

用映射替换循环
EN

Stack Overflow用户
提问于 2017-04-09 10:10:31
回答 1查看 3.2K关注 0票数 1

我试图用map函数替换下面的for循环,我假设它必须类似于map(inBetween,input.split("\n")),但是当我这样做时,我的小时字典保持不变。我觉得它甚至没有进入这个功能。

有人知道怎么做吗?

代码语言:javascript
复制
#!/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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-09 10:38:18

正如Willem Van Onsem在一篇评论中已经说过的,map在Python3中很懒惰。与其像Python2那样立即将函数应用于所有项并返回一个列表,map将返回一个生成器,您需要迭代这个生成器才能真正执行转换:

代码语言:javascript
复制
>>> 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是某种“map对象”(它是映射生成器)。我们必须首先迭代这个生成器,以便实际生成值并调用函数:

代码语言:javascript
复制
>>> for x in res:
        print(x)

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

如果您想要返回一个列表,还可以对结果调用list(),立即调用每个元素的函数:

代码语言:javascript
复制
>>> list(map(square, lst))
Calculating square of 1
Calculating square of 2
Calculating square of 3
[1, 4, 9]

不过,请注意,您的情况并不适合map。据我所知,从您的代码和输入中可以看出,输入的第一行是一个数字,其中包含需要处理的后面的行数。

因此,在您的情况下,除非您想要主动忽略第一行(只处理每一行),否则不应该在这里使用map

但是,通过存储这些split调用的结果,您可以使代码变得更简单(更高效)。例如:

代码语言:javascript
复制
lines = input.split('\n')
for i in range(1, int(lines[0]) + 1):
    inBetween(lines[i])

在这里,您只是将输入分割一次,而不是每次迭代一次。

至于您的inBetween函数,您还可以在这里使用for循环,这使它更加简单:

代码语言:javascript
复制
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字典),它在其确切上下文之外并不真正有用,因此您可以在这里简单地内联该功能。然后您甚至可以提取逻辑,因此您可以得到一个只处理输入并返回hours字典的函数。与defaultdict相结合,这实际上看起来很不错:

代码语言:javascript
复制
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)

这已经是一切了

代码语言:javascript
复制
>>> 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 }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43305496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档