Мониторинг переводов между счетами python + dict

Рейтинг: 0Ответов: 1Опубликовано: 28.02.2023

Есть 4 словаря-счета на бирже. С парами валюта - кво:

спот = {'dol': 10.0, 'eur': 22.0, 'lir': 34.0, 'cny': 45.0}
маржа = {'dol': 1.2, 'eur': 1.8, 'lir': 35.3, 'cny': 4.2}
крос = {'dol': 12.5, 'eur': 25.0, 'lir': 23.9, 'cny': 43.4}
фьюч = {'dol': 13.3, 'eur': 25.2, 'lir': 36.1, 'cny': 38.8}

С каждой итерацией значения могут меняться , это переводы между счетами, переводить можно только ключ-ключ. Мне нужно реализовать цикл для показа из какого в какой счет была переведена валюта, какая и сколько, т.е где стало меньше а где больше, за одну итерацию может быть только один перевод. Написал такой код но он работает не правильно:

dict_list = [dict1, dict2, dict3, dict4]

prev_values = {k: None for k in dict1.keys()}

for d in dict_list:
    for k in d.keys():
        if prev_values[k] is not None and prev_values[k] != d[k]:
            print(f'Значение ключа {k} изменилось из {prev_values[k]} в {d[k]}')
        prev_values[k] = d[k]

Кто знает помогите пж.

Ответы

▲ 1Принят

Удобнее держать словари не в списке, а в словаре. В циклах реализовано сравнение значений по одинаковым ключам.

import copy

p_dict = {'spot': {'dol': 10.0, 'eur': 22.0, 'lir': 34.0, 'cny': 45.0},
          'marja': {'dol': 1.2, 'eur': 1.8, 'lir': 35.3, 'cny': 4.2},
          'cross': {'dol': 12.5, 'eur': 25.0, 'lir': 23.9, 'cny': 43.4},
          'future': {'dol': 13.3, 'eur': 25.2, 'lir': 36.1, 'cny': 38.8}}

n_dict = copy.deepcopy(p_dict)
n_dict['spot']['dol'] -= 1
n_dict['cross']['dol'] += 1

for k1, v1 in n_dict.items():
    for k2, v2 in v1.items():
        if v2 != p_dict[k1][k2]:
            print(f'Изменилось значение в счете `{k1}`, валюте `{k2}` на {v2 - p_dict[k1][k2]}')
Изменилось значение в счете `spot`, валюте `dol` на -1.0
Изменилось значение в счете `cross`, валюте `dol` на 1.0

Вариант 2. В переменную oper помещается первое встреченное отклонение в виде кортежа (дельта, счет), которое сравнивается со вторым отклонением, и если они равны в абсолюте, то выводится сообщение

import copy

p_dict = {'spot': {'dol': 10.0, 'eur': 22.0, 'lir': 34.0, 'cny': 45.0},
          'marja': {'dol': 1.2, 'eur': 1.8, 'lir': 35.3, 'cny': 4.2},
          'cross': {'dol': 12.5, 'eur': 25.0, 'lir': 23.9, 'cny': 43.4},
          'future': {'dol': 13.3, 'eur': 25.2, 'lir': 36.1, 'cny': 38.8}}

n_dict = copy.deepcopy(p_dict)
n_dict['spot']['dol'] -= 1
n_dict['cross']['dol'] += 1

oper = None
for k1, v1 in n_dict.items():
    for k2, v2 in v1.items():
        v3 = p_dict[k1][k2]
        if v2 != v3:
            if oper is not None and abs(v2 - v3) == abs(oper[0]):
                print(f'Произошел перевод между счетами `{k1}` и `{oper[1]}`, валюта `{k2}` на {abs(oper[0])} ед.')
            else:
                oper = v3 - v2, k1
Произошел перевод между счетами `cross` и `spot`, валюта `dol` на 1.0 ед.