gpt4 book ai didi

python - 用map替换for循环

转载 作者:行者123 更新时间:2023-11-30 22:39:03 27 4
gpt4 key购买 nike

我正在尝试用 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 在 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 是一些“ map 对象”(即 map 生成器)。我们必须首先迭代这个生成器才能实际生成值并调用函数:

>>> 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 字典),因此在其确切上下文之外并没有真正的用处,因此您可以简单地在此处内联功能。然后,您甚至可以提取逻辑,这样您就得到了一个仅处理输入并返回该 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 }

关于python - 用map替换for循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43305496/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com