Выберите один поплавок из списка - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть список генерируемых чисел, начиная с 0 до 1 в порядке возрастания.Мне нужно что-то сделать с выбранными числами с плавающей точкой, например, около 0,25, 0,5, 0,75.Но сгенерированные числа с плавающей запятой могут иметь любое количество знаков после запятой и повторяться, как .......... 0.50001, 0.51125, 0.57466459, 0.5925, 0.5925, 0.634, ..........

Мне нужно выбрать только ONE из 0,5 (любой подойдет), а также в других кварталах.Придуманный пример,

list_of_floats = my_some_function()
 for i in list_of_floats:
     if i is near 0.5:
        do_something()

Я пробовал,

list_of_floats = my_some_function()
done_once = False
 for i in list_of_floats:
     if 0.5 < i < 0.6 and done_once is False:
        do_something()
        done_once = True

Этот тип работает для 0,5, но мне нужно сделать и для других контрольных точек (0,25, 0,75 и т. Д.).Должен быть лучший способ сделать это.Пожалуйста, помогите.

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Я бы начал со списка контрольных точек и некоторого порога для «ближнего» (либо на верхнем уровне, либо в паре с каждой контрольной точкой, если «ближний» меняется для каждой контрольной точки).Вы можете воспользоваться данными и контрольными точками, отсортированными в одном и том же порядке, только рассматривая первую контрольную точку в списке и удаляя ее из списка, когда вы получаете удар:

checkpoints = [.25, .5. .75]
for i in list_of_floats:
    if abs(i - checkpoints[0]) < .1:
        do_something()
        checkpoints.pop(0)
    if not checkpoints:
        break
0 голосов
/ 14 декабря 2018

если вы хотите, чтобы значение было ближе всего к 0,5, то что-то вроде этого может привести вас туда:

import numpy

floats = numpy.array([0.1, 0.3, 0.48, 0.51, 0.55, 0.72, 0.8])

higher = numpy.where(floats > 0.5)
rest = numpy.where(floats[higher] < 0.6)
possibilities = floats[higher][rest]
print(min(possibilities))
>>>0.51
0 голосов
/ 14 декабря 2018

Я не совсем уверен, что вы собираетесь, но похоже, что вы ищете np.isclose.Например, если вы хотите найти все числа с плавающей точкой в ​​вашем массиве, которые находятся в пределах 0,01 от 0,5, вы можете использовать:

list_of_floats = np.array([0.50001, 0.51125, 0.57466459, 0.5925, 0.5925, 0.634])

# note that atol is the tolerance within which you want to select your floats
>>> list_of_floats[np.isclose(0.5, list_of_floats, atol = 0.01)]
array([0.50001])

Или, так как вам нужен только один, и любой из них будет делать, выберите первый:

>>> list_of_floats[np.isclose(0.5, list_of_floats, atol = 0.01)][0]
0.50001
...