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