为什么在将 map() 与 .append() 方法一起使用时返回四个列表

Why return four lists when using map() with the method .append()

提问人:joe 提问时间:12/27/2018 最后编辑:jppjoe 更新时间:1/14/2019 访问量:61

问:

我正在尝试使用该方法测试该函数,但得到了错误的输出。mapappend

法典

numbers = [
    [34, 63, 88, 71, 29], 
    [90, 78, 51, 27, 45], 
    [63, 37, 85, 46, 22], 
    [51, 22, 34, 11, 18]
]

numbers_tmp = []

def mean_append(num_list):
    numbers_tmp.append(sum(num_list) / len(num_list))
    return numbers_tmp

print(list(map(mean_append, numbers)))

预期输出

[57.0, 58.2, 50.6, 27.2]

实际输出

[
    [57.0, 58.2, 50.6, 27.2], 
    [57.0, 58.2, 50.6, 27.2], 
    [57.0, 58.2, 50.6, 27.2], 
    [57.0, 58.2, 50.6, 27.2]
]
python-3.x 列表

评论

2赞 Joseph Sible-Reinstate Monica 12/27/2018
你为什么要创建一个全局变量,然后忽略它的内容,而支持返回的内容?numbers_tmpmap
1赞 juanpa.arrivillaga 12/27/2018
不要在 中使用副作用。只需使用 for 循环即可map

答:

0赞 Ark-kun 12/27/2018 #1

map为输入序列中的每个对象返回一个输出对象。输入序列有 4 个对象,因此输出有 4 个对象。它们都是相同的,因为您的函数总是返回相同的对象。若要解决此问题,请停止使用中的全局变量。numbers_tmpmap

评论

0赞 juanpa.arrivillaga 12/27/2018
和副作用。
3赞 jpp 12/27/2018 #2

内置映射适用于可迭代对象中的每个值。因此,您的函数应该包含可应用于每个子列表的逻辑:

def mean_calculator(num_list):
    return sum(num_list) / len(num_list)

res = list(map(mean_calculator, numbers))

print(res)

[57.0, 58.2, 50.6, 27.2]

或者,您可以使用标准库中的 statistics.mean

from statistics import mean

res = list(map(mean, numbers))
0赞 Hasitha 12/27/2018 #3
numbers = [[34, 63, 88, 71, 29], [90, 78, 51, 27, 45], [63, 37, 85, 46, 22], [51, 22, 34, 11, 18]]
def mean_append(num_list):
    return sum(num_list) / len(num_list)

print(list(map(mean_append, numbers)))