Сравнение округленного списка с предоставленным пользователем списком - PullRequest
1 голос
/ 04 июня 2019

Я читаю, обрабатываю и подгоняю некоторые данные, которые были собраны при разных температурах.Для каждого набора измеренная температура немного колеблется, поэтому я сгруппировал результаты по средним значениям температуры.Затем я прошу пользователя выбрать интересующие температуры (например, отменить шумные) через raw_input и использовать эти индексы для определения местоположения данных, которые будут установлены.Проблема состоит в том, что усредненные числа с плавающей точкой и числа, указанные пользователем, используют разные представления и поэтому не могут сравниваться (см. Python - округление числа до 2 цифр ).

Ниже приведен примериз того, что делает мой код:

# Example of temperatures on my data set
T = [25.99545, 25.99702, 25.9982, 25.99859, 25.9986, 25.99899, 25.99899, 25.99899, 25.99899, 25.99899, 25.99899, 25.99938, 25.99938, 26.00016, 26.00056, 26.00056, 26.00056, 26.00056, 26.00056, 26.00095, 26.00095, 26.00095, 26.00134, 26.00134, 26.00134, 26.00174, 26.00213, 26.00252, 27.998, 27.99846, 27.99846, 27.99891, 27.99891, 27.99891, 27.99935, 27.99935, 27.99936, 27.9998, 27.9998, 27.9998, 27.99981, 27.99981, 28.00025, 28.00025, 28.00026, 28.00026, 28.0007, 28.0007, 28.0007, 28.0007, 28.00114, 28.00115, 28.00115, 28.00115, 28.00204, 28.00249, 29.99771, 29.99822, 29.99822, 29.99822, 29.99873, 29.99873, 29.99873, 29.99923, 29.99923, 29.99924, 29.99974, 29.99974, 29.99975, 29.99975, 29.99975, 30.00026, 30.00026, 30.00026, 30.00026, 30.00076, 30.00076, 30.00127, 30.00127, 30.00178, 30.00178, 30.00178, 30.00229, 30.00229, 31.99801, 31.99858, 31.99858, 31.99858, 31.99858, 31.99858, 31.99916, 31.99916, 31.99916, 31.99916, 31.99973, 32.00029, 32.0003, 32.0003, 32.0003, 32.0003, 32.0003, 32.00086, 32.00086, 32.00087, 32.00087, 32.00143, 32.00143, 32.00143, 32.002, 32.00201, 32.00257, 32.00372 ]
av_T = [ 25.999885000000003, 28.000059642857156, 30.000000357142863, 32.000254285714284 ] # Average of temperatures
rounded_T = [ round(x,2) for x in av_T ] 

selected_T = [ 26.0, 30.0 ] # User selection of temperatures

if selected_T not in rounded_T: # Check the user indicates valid temperatures
    print('The selected temperature is not in your experimental set')
    exit()

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

selected_T = [ 25.999885000000003, 30.000000357142863 ]

, я получаю такое же поведение.Есть ли способ сделать это сравнение, не прибегая к десятичной точности?

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Ваш код преобразования в порядке, проблема в том, что вы не можете использовать оператор in для сравнения, если один список содержится в другом списке, поскольку членство работает путем проверки наличия одного элемента в списке.

Чтобы проверить, содержится ли один список в другом, вы можете преобразовать оба списка в наборы и выполнить set.intersection для них

# Example of temperatures on my data set
T = [25.99545, 25.99702, 25.9982, 25.99859, 25.9986, 25.99899, 25.99899, 25.99899, 25.99899, 25.99899, 25.99899, 25.99938, 25.99938, 26.00016, 26.00056, 26.00056, 26.00056, 26.00056, 26.00056, 26.00095, 26.00095, 26.00095, 26.00134, 26.00134, 26.00134, 26.00174, 26.00213, 26.00252, 27.998, 27.99846, 27.99846, 27.99891, 27.99891, 27.99891, 27.99935, 27.99935, 27.99936, 27.9998, 27.9998, 27.9998, 27.99981, 27.99981, 28.00025, 28.00025, 28.00026, 28.00026, 28.0007, 28.0007, 28.0007, 28.0007, 28.00114, 28.00115, 28.00115, 28.00115, 28.00204, 28.00249, 29.99771, 29.99822, 29.99822, 29.99822, 29.99873, 29.99873, 29.99873, 29.99923, 29.99923, 29.99924, 29.99974, 29.99974, 29.99975, 29.99975, 29.99975, 30.00026, 30.00026, 30.00026, 30.00026, 30.00076, 30.00076, 30.00127, 30.00127, 30.00178, 30.00178, 30.00178, 30.00229, 30.00229, 31.99801, 31.99858, 31.99858, 31.99858, 31.99858, 31.99858, 31.99916, 31.99916, 31.99916, 31.99916, 31.99973, 32.00029, 32.0003, 32.0003, 32.0003, 32.0003, 32.0003, 32.00086, 32.00086, 32.00087, 32.00087, 32.00143, 32.00143, 32.00143, 32.002, 32.00201, 32.00257, 32.00372 ]
av_T = [ 25.999885000000003, 28.000059642857156, 30.000000357142863, 32.000254285714284 ] # Average of temperatures
rounded_T = [ round(x,2) for x in av_T ]

selected_T = [ 26.0, 30.0 ] # User selection of temperatures

#Get common elements
common_elems = set(selected_T).intersection(set(rounded_T))

#Check if common elements exist by using the fact that empty sets evaluate to False
if not common_elems:
    print('The selected temperature is not in your experimental set')
    exit()

Это ничего не выдаст, так как условие if не выполнено

0 голосов
/ 04 июня 2019

Взгляните на математика библиотека isclose метод

math.isclose (a, b, *, rel_tol = 1e-09, abs_tol = 0.0)

Вернуть True, если значения a и b близки друг к другу и False в противном случае.

Вы должны быть в состоянии использовать rel_tol (Относительный допуск) в соответствии с вашими требованиями.

...