У меня есть список векторов (в 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), а затем я использую эти значения для вычислений и фильтрации. Это действительно лучший способ? Есть ли какие-то ужасные недостатки, о которых мне следует знать?