Есть ли способ объединить несколько вариантов понимания списков в Python?

#python #list #list-comprehension

Вопрос:

Вот функция в моем коде:

 def get_weights(Last_scan, Peak_shot):
    Est_Succshots = [x*Peak_shot for x in Last_scan.values()]
    Est_error = [np.sqrt(i)/Peak_shot for i in Est_Succshots]
    Is = [1/m for m in Est_error]
    Weights = [i/sum(Is) for i in Is]
    return Weights
 

Для расчета я использовал 4 понимания списка. Интересно, есть ли более короткий способ или другой подход, с помощью которого я могу выполнять такие вычисления? Спасибо за помощь:)

Комментарии:

1. Я бы сказал, что это хороший случай для простого использования цикла for вместо понимания списка. Нет причин создавать новый список на каждом шаге, когда вы могли бы просто использовать цикл for и выполнять все вычисления одновременно, оставаясь одинаково читабельными.

2. Вы можете объединить все ваши картографические операции в одну. Не уверен, что так лучше.

3. не уверен, что вам нужен второй цикл здесь, я иду с Is = [1/(np.sqrt(i)/Peak_shot) for i in Est_Succshots] и отбрасываю Est_error

Ответ №1:

Предполагая, что Last_scan.values() это список чисел и Peak_shot является числом, это, по-видимому, эквивалентно

 def get_weights(Last_scan, Peak_shot):
    Is =  np.sqrt(Peak_shot/np.array(Last_scan.values()))
    return Is/Is.sum()
 

Комментарии:

1. Спасибо за ответ! Да Last_scan -это словарь и Peak_shot это число. Он возвращается TypeError: unsupported operand type(s) for /: 'int' and 'dict_values'

2. В таком случае замените Last_scan.values() на list(Last_scan.values()) .

3. Потрясающе. Большое спасибо!