[英]Why is this returning a generators list?
我是初學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>]
有人能指出我這里發生了什么嗎?
非常感謝你
生成器是迭代的,在迭代時耗盡。 這是您使用語句sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors)
。 如果你想要的是一個列表列表,正確的陳述將是[sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors)]
,而不是列表理解。 列表的內聯生成,可以這么說。
我在這里找到了一篇關於這個主題的文章。 讀一讀。
問題是你用於“平滑”數據的表達式寫得不正確 - 所以它評估為一個叫做生成器表達式的東西。 我認為下面的代碼是表達它的正確方法:
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)
你遇到過生成器表達式 ,這些表達式集成在理解列表語法中但會導致數字錯誤。
例如:
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]
在你的情況下,我認為你可以通過添加[]
aroud你的表達來糾正你的問題:
y.append([sum(x[i+t])/width for t in range(-n_neighbors,n_neighbors)])
[]
將強制生成器評估值。 Generator是強大的對象,用於節省內存和延遲執行。 這不是你的目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.