簡體   English   中英

如何正確捕獲列表推導中的生成器輸出?

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

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