как эффективно проверить смежные диапазоны в Python - PullRequest
0 голосов
/ 01 мая 2018

присвоение оценки на основе диапазона:

def getGrade(size):
    grade =''
    if size <= 32:
        grade = 'p4'
    elif size > 32 and size <=64:
        grade = 'p6'
    elif size > 64 and size <= 128:
        grade = 'p10'
    elif size > 128 and size <= 256:
        grade = 'p15'
    elif size > 256 and size <=512:
        grade = 'p20'
    elif size > 512 and size <= 1024:
        grade = 'p30'
    elif size > 1024 and size <= 2048:
        grade = 'p40'
    ......

Проблема в том, нужно добавить еще 20 проверок, поэтому есть ли способ добиться большего успеха, чем этот подход.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Подход грубой силы был бы прост как

all_grades = [i for i in chain(repeat('p4',32),repeat('p6',64-32) and so on)]

then you can get grade as

grade = all_grades[size-1]

может потребоваться пробел, если список экспоненциальный

0 голосов
/ 01 мая 2018

Поскольку диапазоны являются смежными, вы можете избежать повторения нижней границы.

Помещение всех диапазонов в кортежи может сэкономить вам время при наборе текста (если первый диапазон не уменьшается до отрицательной бесконечности, рассмотрите возможность добавления кортежа (0, None) перед всеми остальными:

def getGrade(size):
    grades = (
         (32, 'p4'),
         (64, 'p6'),
        (128, 'p10'),
        ...
    )

    for maxVal, grade in grades:
        if size <= maxVal:
            return grade

Тест:

>>> getGrade(45)
'p6'
>>> getGrade(100)
'p10'

Эффективность:

Если список grades очень длинный, вы можете добиться лучшего времени выполнения, чем сканирование каждого элемента. Поскольку список отсортирован, вы можете использовать bisect, заменив цикл for:

    for maxVal, grade in grades:
        if size <= maxVal:
            return grade

с:

    index = bisect.bisect(grades, (size, ))
    if index < len(grades):
        return grades[index][1]

Количество шагов уменьшено (в худшем случае) с N (длина grades) до log 2 (N).

...