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
Run Code Online (Sandbox Code Playgroud)Is this really the best way?
嗯,它确实有效,如果你真的,真的想写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
| 归档时间: |
|
| 查看次数: |
9191 次 |
| 最近记录: |