Промежуточная переменная в понимании списка для одновременной фильтрации и преобразования

У меня есть список векторов (в Python) который я хочу нормализовать, одновременно удаляя векторы, которые изначально имели небольшие нормы.

Входной список, например,

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

И мне нужно, чтобы результат был (x * n, y * n ) при n = (x ** 2 + y ** 2) ** - 0,5

Если мне просто нужны нормы, например, это было бы легко с пониманием списка:

an = [ (x**2+y**2)**0.5 for x,y in a ]

Также было бы легко сохранить только нормализованный x, например, но я хочу иметь эту временную переменную "n", чтобы использовать ее в двух вычислениях, и затем выбросьте его.

Я не могу просто использовать лямбда-функцию, потому что мне также нужно 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)]

Внутренний список генерирует кортежи с дополнительным значением (n), а затем я использую эти значения для вычислений и фильтрации. Это действительно лучший способ? Есть ли какие-то ужасные недостатки, о которых мне следует знать?

15
задан Xavier Guihot 27 April 2019 в 15:34
поделиться