Помещение диапазонов с плавающей запятой в бункеры

Учитывая 5 диапазонов

[(0., 0.), (0., 0.3), (0.3, 0.5), (0.5, 0.8), (0.8, 1.0)]

что соответствует:

  • [0.0, 0.0]
  • (0.0, 0.3]
  • (0.3, 0.5]
  • (0.5, 0.8]
  • (0.8, 1.0]

И список входных чисел с плавающей запятой:

[0.5293113408538,
 0.3105914215541,
 0.7748290363338001,
 0.7745464933980998,
 0.17276995816109997,
 0.83335888200110002,
 0.0]

Цель состоит в том, чтобы разбить поплавки в указанные выше диапазоны и вывести:

[3, 2, 3, 3, 1, 4, 0]

Я пробовал это:

score_ranges =  [(0., 0.), (0., 0.3), (0.3, 0.5), (0.5, 0.8), (0.8, 1.0)]

x = [0.5293113408538,
 0.3105914215541,
 0.7748290363338001,
 0.7745464933980998,
 0.17276995816109997,
 0.83335888200110002,
 0.0]

binning = []

for i in x:
    for j, (start, end) in enumerate(score_ranges):
        if i == 0:
            binning.append(0)
            break
        elif start < i <= end:
            binning.append(j)
            break

Но есть ли менее подробный способ получить желаемые выходные данные?

Кроме того, нулевой диапазон здесь жестко запрограммирован, потому что его нижняя граница включает в себя, в отличие от других классов, есть ли лучший способ справиться с этим?


person alvas    schedule 12.06.2017    source источник


Ответы (1)


Вы можете использовать модуль bisect, но вам придется немного изменить свой код. Сократите список кортежей до списка чисел с плавающей запятой.

import bisect

score_ranges =  [0., 0.3, 0.5, 0.8, 1.0]
binning = []

x = [
    0.5293113408538,
    0.3105914215541,
    0.7748290363338001,
    0.7745464933980998,
    0.17276995816109997,
    0.83335888200110002,
    0.0]

for a in x:
    binning.append(bisect.bisect_left(score_ranges, a))
person vZ10    schedule 12.06.2017