[英]How to correctly capture generator output in a list comprehension?
我對用於在python中創建平方和的生成器感到困惑。 本質上,我要遍歷存儲在字典中的向量,並找到具有另一個目標向量的SS。
我正在嘗試通過使用列表理解和生成器以更多的方式進行Python編碼,但仍在努力理解其工作原理。 “生成”的函數只返回一個字符串
<generator object distance.<locals>.operation at 0x00000181748E2048>
這顯然是錯誤的。 任何意見,將不勝感激。 理想情況下,希望輸出SS操作的結果,但同時也對我的誤解感興趣。
import math
v = [2,-2,1,3]
dv = {'a1':[0,1,3,5], 'a2':[2,5,6,7], 'a3':[1,-2,-3,2], 'a4':[2,2,1,1],
'a5':[3,2,1,-1]}
def distance(v, dv):
def operation(orig, nbr):
yield [sum(math.sqrt(orig - nbr) for orig, nbr in zip(orig, nbr))]
for k in sorted(dv):
l = dv[k]
list = operation(v,l)
print(list)
distance(v, dv)
您使用生成器的方式錯誤。 無論如何,該yield
只會執行一次(前提是您將返回值轉換為列表)。 結果甚至沒有在生成器表達式中使用。
您可以將該代碼更改為如下所示:
def operation(orig, nbr):
for orig, nbr in zip(orig, nbr):
yield math.sqrt(abs(orig - nbr))
for k in sorted(dv):
l = dv[k]
value = sum(operation(v,l))
print(value)
現在,這正確使用了生成器功能。 每當sum()
函數需要下一個值時, operation()
函數內部的for
循環將執行1 step
,它將產生下一個sqrt
值,直到耗盡為止。
您要使用list(operation(v, l))
。 生成器作為生成器對象產生,因此您必須使用list()
將它們顯式轉換為列表。
這里用例子解釋。
返回列表時,您不需要yield
。 下面的sum
函數在operation
上實際上是一個生成器表達式 ,可以完成相同的操作。
因此,使用生成器表達式使用的內存較少, sum([x ** 0.5 for x in some_list])
變為sum(x for x in some_list)
。
def distance(v, dv):
def operation(orig, nbr):
return sum(abs(orig - nbr) ** 0.5 for orig, nbr in zip(orig, nbr))
return [operation(v, dv[l]) for l in sorted(dv)]
>>> distance(v, dv)
[5.974691494688162, 6.8818192885643805, 4.0, 3.414213562373095, 5.0]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.