@Smeilz1
За любое развитие

Как получить результат условия имея состояния?

У меня есть словарь, который содержит тикеры: данные
tickers = {'BTC': [200, 149, 98, 44], 'ETH': [200, 320, 405, 460]}
Я написал функцию, которая может узнавать состояние из условия.
Всего 4 различных состояния
prev и now - ставнение 2 элементов в листе друг с другом. Сегодня и вчера
Например для BTC:
149 и 200
98 и 149
44 и 98
# check state . Описываем состояния для условия. Может быть 4 различных
def check_state(now, prev):
    state = None
    if now >= prev:
        if now <= 1.5 * prev:
                state = 0
    if now >= 1.5 * prev:
        state = 1
    if now < prev:
        if now * 1.5 >= prev:
                state = 2
    if now * 1.5 < prev:
        state = 3
    # возвращаем состояние
    return state

Теперь я хочу прогнать по всем элементам словаря и узнать состояние в каждой точке и на выходе получить такой же словарь состояний. Например Должно получиться так
tickers_state = {'BTC': [None, 3, 3, 3], 'ETH': [None, 1, 0, 0]}
У первого элемента нет состояния, так как у него нет предыдущего значения.
Как грамотно сделать?
P.S. Я:
1)Итерирую все элементы в tickers
2)Итерирую все элементы в list
3)Вызываю функцию check_state и получаю state
Вопросы:
Как исключить первый элемент, так как у него нет предыдущего и состояние None
Что подавать в качестве параметра функции check_state ?
  • Вопрос задан
  • 123 просмотра
Решения вопроса 1
netpastor
@netpastor
Python developer
def list_state(input_list):
    check0 = lambda prev, now: 0 if now <= 1.5 * prev and now >= prev else None
    check1 = lambda prev, nov: 1 if now >= 1.5 * prev else None
    check2 = lambda prev, now: 2 if now * 1.5 >= prev and now < prev else None
    check3 = lambda prev, now: 3 if now * 1.5 < prev else None

    output = [None]
    for index in range(len(input_list)):
        if index > len(input_list)-2:
            break
        prev, now = input_list[index], input_list[index+1]
        for condition in (check0, check1, check2, check3):
            result = condition(prev, now)
            if result is not None:
                output.append(result)
                break
    return output

a =  [200, 320, 405, 460]
print(list_state(a))
# [None, 1, 0, 0]
a = [200, 149, 98, 44]
print(list_state(a))
# [None, 2, 3, 3]

tickers = {'BTC': [200, 149, 98, 44], 'ETH': [200, 320, 405, 460]}
tickers_state = {}
for key, data_list in tickers.items():
    tickers_state[key] = list_state(data_list)
print(tickers_state)
# {'BTC': [None, 2, 3, 3], 'ETH': [None, 1, 0, 0]}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@Swartalf
1. if переделать на if-elif.
2. вложеные if можжно объединить AND 'ом
3 . если после условий логики не будет, то можете сразу делать return
4. Проверять будете циклом? Если да, то для нулевого элемента списка в prev передавайте None
if prev  is None:
  return None
Ответ написан
Ваш ответ на вопрос

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

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