簡體   English   中英

為什么這會返回生成器列表?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM