@PILITYXXX123

Как найти в списке наиболее близкое значение Python?

Есть список -
a = ['2020-07-30', '2020-07-31', '2020-07-31', '2020-07-31', '2020-08-04', '2020-08-05', '2020-08-06', '2020-08-06', '2020-08-08', '2020-08-08']
И есть 2 переменные
b = '2020-07-27'
c = '2020-08-07'

Надо в переменную b1 записать самое близкое значение к переменной b из списка, то есть - 2020-07-30 либо 2020-08-08 не важно.

А в переменную c1 записать самое близкое значение к переменной c из списка, то есть - 2020-08-06 либо
  • Вопрос задан
  • 562 просмотра
Решения вопроса 2
dimonchik2013
@dimonchik2013
non progredi est regredi
ab = a[:]
ac = a[:]
ab.append(b)
ac.append(c)
ab.sort()
ac.sort()
ab_index = ab.index(b)-1 if ab.index(b) > 0 else 0
ac_index = ac.index(c)-1 if ac.index(c) > 0 else 0
print(ab[ab_index])
print(ac[ac_index])


ну или +1 с проверкой на конец списка
Ответ написан
Комментировать
@dmshar
Как то сложно все. Мне кажется - можно проще. По сути - две строки.
Для полноты картины добавил еще и третий пример.
import numpy as np
a = ['2020-07-30', '2020-07-31', '2020-07-31', '2020-07-31', '2020-08-04', '2020-08-05', '2020-08-06', '2020-08-06', '2020-08-08', '2020-08-08']
b = '2020-07-27'
c = '2020-08-07'
d = '2020-08-02'

date = np.array(a, dtype=np.datetime64)
b1=a[np.argmin(np.abs(date-np.array(b,dtype=np.datetime64)))]

c1=a[np.argmin(np.abs(date-np.array(c,dtype=np.datetime64)))]
d1=a[np.argmin(np.abs(date-np.array(d,dtype=np.datetime64)))]

print (b,'->',b1)
print (c,'->',c1)
print (d,'->',d1)


Имеем :
2020-07-27 -> 2020-07-30
2020-08-07 -> 2020-08-06
2020-08-02 -> 2020-07-31
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@zexer
import datetime

def convert_string_to_date(string: str):
    return datetime.datetime.strptime(string, '%Y-%m-%d').date()

def get_near_date(date, date_list):
    
    date_list_desc = sorted(date_list, reverse=True)
    first_try = [date > i for i in date_list_desc]
    
    if True in first_try:
        return date_list_desc[first_try.index(True)]
        
    date_list_asc = sorted(date_list, reverse=False)
    second_try = [date < i for i in date_list_asc]
    
    if True in second_try:
        return date_list_asc[second_try.index(True)]

a = ['2020-07-30', '2020-07-31', '2020-07-31', '2020-07-31', '2020-08-04', '2020-08-05', '2020-08-06', '2020-08-06', '2020-08-08', '2020-08-08']

a = [convert_string_to_date(i) for i in a]

b = convert_string_to_date('2020-07-27')
c = convert_string_to_date('2020-08-07')
print(get_near_date(b, a))
# 2020-07-30

print(get_near_date(c, a))
# 2020-08-06
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы