列表理解中的中间变量,用于同时过滤和转换

div*_*ero 15 python mapping filtering list-comprehension list

我有一个我想要规范化的向量列表(在Python中),同时删除最初具有小规范的向量.

输入列表例如是

a = [(1,1),(1,2),(2,2),(3,4)]
Run Code Online (Sandbox Code Playgroud)

我需要输出为(x*n,y*n),其中n =(x*2 + y*2)** - 0.5

例如,如果我只需要规范,那么列表理解就很容易:

an = [ (x**2+y**2)**0.5 for x,y in a ]
Run Code Online (Sandbox Code Playgroud)

例如,也可以很容易地存储一个标准化的x,但我想要的是将这个临时变量"n"用于两次计算,然后抛弃它.

我也不能只使用lambda函数,因为我还需要n来过滤列表.那么最好的方法是什么?

现在我在这里使用这个嵌套列表理解(在内部列表中有一个表达式):

a = [(1,1),(1,2),(2,2),(3,4)]

[(x*n,y*n) for (n,x,y) in (( (x**2.+y**2.)**-0.5 ,x,y) for x,y in a) if n < 0.4]

# Out[14]: 
# [(0.70710678118654757, 0.70710678118654757),
#  (0.60000000000000009, 0.80000000000000004)]
Run Code Online (Sandbox Code Playgroud)

内部列表生成带有额外值(n)的元组,然后我将这些值用于计算和过滤.这真的是最好的方式吗?我应该注意哪些可怕的低效率?

Joc*_*zel 11

Is this really the best way?
Run Code Online (Sandbox Code Playgroud)

嗯,它确实有效,如果你真的,真的想写oneliners那么它是你能做的最好的.

另一方面,简单的4行函数可以更清晰地做到:

def normfilter(vecs, min_norm):
    for x,y in vecs:
        n = (x**2.+y**2.)**-0.5
        if min_norm < n:
            yield (x*n,y*n)

normalized = list(normfilter(vectors, 0.4))
Run Code Online (Sandbox Code Playgroud)

顺便说一句,你的代码或描述中有一个错误 - 你说你过滤掉了短向量,但你的代码则相反:p