Самый эффективный способ перебрать список питонов, сравнить и настроить значения элементов - PullRequest
0 голосов
/ 01 марта 2019

У меня есть список элементов с определенным атрибутом / переменной.Прежде всего мне нужно проверить, все ли атрибуты имеют одинаковое значение, если нет, мне нужно адаптировать этот атрибут для каждого элемента к более высокому значению.Дело в том, что такой цикл не сложно запрограммировать.Тем не менее, я хотел бы знать, какой самый эффективный способ сделать это.

Мой текущий подход работает нормально, но он перебирает список 2 раза, имеет две локальные переменные и просто не чувствует себя достаточно эффективным.

Я упростил код.Это в основном то, что у меня есть:

    biggest_value = 0
    re_calc = 0
    for _, element in enumerate(element_list):
        if element.value > biggest_value :
            biggest_value = element.value
            re_calc += 1
    if re_calc > 1:
        for _, element in enumerate(element_list):
            element.value = adjust_value(biggest_value)
            element_list(_) = element

Меня раздражает необходимость переменной re_calc.Простая проверка на самое большое значение не имеет большого значения.Но эта задача состоит из 3 шагов: «Сравнить атрибуты -> Найти наибольшее значение -> возможно настроить другие».Однако я не хочу перебирать этот список 3 раза.Даже два раза, как мое нынешнее предложение.

Должен быть более эффективный способ.Есть идеи?Заранее спасибо.

1 Ответ

0 голосов
/ 01 марта 2019

Первый цикл просто определяет наибольшее значение element_list.Таким образом, подход может быть следующим: преобразовать element_list в пустой массив.К сожалению, вы не говорите, как выглядит список.Но если список содержит числа, то L = np.array(element_list), вероятно, может это сделать.После этого используйте np.max(L).Команды Numpy без циклов for обычно намного быстрее.

import numpy as np
nl = 10
L = np.random.rand(nl)
biggest_value = np.max(L)
L, biggest_value

дает

(array([0.70047074, 0.14160459, 0.75061621, 0.89013494, 0.70587705,
        0.50218377, 0.31197993, 0.42670057, 0.67869183, 0.04415816]),
 0.8901349369179461)

Во втором цикле for не очевидно, чего вы хотите достичь.К сожалению, вы не даете вход и желаемый вывод и не говорите, что должен делать adjust_value.Для поддержки будет полезен минимальный работающий код с данными.

...