我是Python初学者。 我正在尝试通过平均多个邻居的分量来定义“平滑”浮点列表的函数。
这是我的代码:
import random
random.seed(1)
def moving_window_average(x, n_neighbors=1):
width = n_neighbors*2 + 1
y = list()
for i in range(n):
y.append(sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors))
return y
x=[0,10,5,3,1,5]
avg=moving_window_average(x, 1)
print(avg)
在输出中,我得到的似乎是“发电机”列表,这是我不知道广告所期望的。 特别是:
[<generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992aba0>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992ab48>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992a728>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992aa98>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992aa40>, <generator object moving_window_average.<locals>.<genexpr> at 0x7f57f992a9e8>]
有人可以指出我在这里发生的事情吗?
非常感谢
答案 0 :(得分:0)
生成器是可迭代的,在迭代时会耗尽。这是使用语句null
创建的。如果您要的是列表列表,则正确的语句应为sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors)
,这是列表理解。可以说是列表的内联生成。
可以在here上找到我在该主题上找到的一篇文章。阅读。
答案 1 :(得分:0)
问题在于您用于“平滑”数据的表达式编写不正确-因此它的计算结果为generator expression。我认为以下代码是表达它的正确方法:
import random
random.seed(1)
n = 3
def moving_window_average(x, n_neighbors=1):
width = n_neighbors*2 + 1
y = list()
for i in range(n):
y.append(sum(x[i+t] for t in range(-n_neighbors,n_neighbors)) / width)
return y
x=[0,10,5,3,1,5]
avg=moving_window_average(x, 1)
print(avg)
答案 2 :(得分:0)
您遇到过generator expressions,该语言已集成到理解列表语法中,但会导致许多错误。
例如:
x=[0,10,5,3,1,5]
(y for y in x)
Out[19]: <generator object <genexpr> at 0x000000000C02FEB8>
[y for y in x]
Out[20]: [0, 10, 5, 3, 1, 5]
print(y for y in x)
<generator object <genexpr> at 0x000000000C02FE60>
print((y for y in x))
<generator object <genexpr> at 0x000000000BFA1938>
print(*(y for y in x))
0 10 5 3 1 5
[(y for y in x)]
Out[24]: [<generator object <genexpr> at 0x000000000BFA1D58>]
list(y for y in x)
Out[25]: [0, 10, 5, 3, 1, 5]
对于您而言,我认为您可以通过在表达式中添加[]
来解决您的问题:
y.append([sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors)])
[]
将强制生成器评估值。生成器是强大的对象,用于节省内存和延迟执行。我不是这里的目标。