Мониторинг переводов между счетами python + dict
Есть 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 ед.