Python: отображение интервалов в значения

[Д0] == сравнивает опорное значение объектов, тогда как equals() метод присутствует в java.lang.String класса сравнивает содержимое String объекта (к другому объекту).

13
задан Agos 29 July 2009 в 09:33
поделиться

6 ответов

import bisect
bisect.bisect_left([100,300,500,800,1000], p)

здесь документы: bisect

41
ответ дан 1 December 2019 в 06:28
поделиться

Вы можете попробовать следующее:

def check_mapping(p):
    mapping = [(100, 0), (300, 1), (500, 2)] # Add all your values and returns here

    for check, value in mapping:
        if p <= check:
            return value

print check_mapping(12)
print check_mapping(101)
print check_mapping(303)

производит:

0
1
2

Как всегда в Python, будут другие способы сделать это лучше.

3
ответ дан 1 December 2019 в 06:28
поделиться

Это действительно ужасно. Без требования не иметь жесткого кодирования, это должно было быть написано так:

if p <= 100:
    return 0
elif p <= 300:
    return 1
elif p <= 500:
    return 2
elif p <= 800:
    return 3
elif p <= 1000:
    return 4
else:
    return 5

Вот примеры создания функции поиска, как линейной, так и с использованием двоичного поиска, с выполненным требованием отсутствия жесткого кодирования и парой проверок работоспособности на две таблицы:

def make_linear_lookup(keys, values):
    assert sorted(keys) == keys
    assert len(values) == len(keys) + 1
    def f(query):
        return values[sum(1 for key in keys if query > key)]
    return f

import bisect
def make_bisect_lookup(keys, values):
    assert sorted(keys) == keys
    assert len(values) == len(keys) + 1
    def f(query):
        return values[bisect.bisect_left(keys, query)]
    return f
3
ответ дан 1 December 2019 в 06:28
поделиться

Попробуйте что-нибудь вроде:

d = {(None,100): 0, 
    (100,200): 1,
    ...
    (1000, None): 5}
value = 300 # example value
for k,v in d.items():
    if (k[0] is None or value > k[0]) and (k[1] is None or value <= k[1]):
        return v
0
ответ дан 1 December 2019 в 06:28
поделиться

Другой способ ...

def which(lst, p): 
    return len([1 for el in lst if p > el])

lst = [100, 300, 500, 800, 1000]
which(lst, 2)
which(lst, 101)
which(lst, 1001)
0
ответ дан 1 December 2019 в 06:28
поделиться
def which_interval(endpoints, number):
    for n, endpoint in enumerate(endpoints):
        if number <= endpoint:
            return n
        previous = endpoint
    return n + 1

Передайте свои конечные точки в виде списка в конечных точках , например:

which_interval([100, 300, 500, 800, 1000], 5)

Изменить:

Вышеупомянутый линейный поиск. Ответ Гленна Мейнарда будет иметь лучшую производительность, так как он использует алгоритм деления пополам.

0
ответ дан 1 December 2019 в 06:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: