如何在Python字典的stock值变化时触发对应打印逻辑
问题
我正在开发一个对比函数,需要在调用本地API返回的字典数据发生变化时触发对应打印,具体需求如下:
- 当
stock值从OOS变为LOW或其他非OOS值时,打印补货提示(示例中为"New value has been found!") - 当
stock从LOW变回OOS时,仅当所有stock均为OOS时才打印"All values are OOS!"
示例数据与预期输出
第一次请求数据
{ '00194953243062': { 'value': '00194953243062', 'stock': 'OOS', 'modificationDate': '2022-10-22T12:02:06.000Z' }, '00194953243086': { 'value': '00194953243086', 'stock': 'OOS', 'modificationDate': '2022-09-30T10:55:45.000Z' }, '00194953243093': { 'value': '00194953243093', 'stock': 'OOS', 'modificationDate': '2022-10-22T11:05:54.000Z' }, '00194953243130': { 'value': '00194953243130', 'stock': 'OOS', 'modificationDate': '2022-10-22T08:55:48.000Z' } }
预期输出:
All values are OOS!
第二次请求数据
{ '00194953243062': { 'value': '00194953243062', 'stock': 'OOS', 'modificationDate': '2022-10-22T12:02:06.000Z' }, '00194953243086': { 'value': '00194953243086', 'stock': 'OOS', 'modificationDate': '2022-09-30T10:55:45.000Z' }, '00194953243093': { 'value': '00194953243093', 'stock': 'OOS', 'modificationDate': '2022-10-22T11:05:54.000Z' }, '00194953243130': { 'value': '00194953243130', 'stock': 'LOW', 'modificationDate': '2022-10-22T08:55:48.000Z' } }
预期输出:
New value has been found!
第三次请求数据
{ '00194953243062': { 'value': '00194953243062', 'stock': 'LOW', 'modificationDate': '2022-10-22T12:02:06.000Z' }, '00194953243086': { 'value': '00194953243086', 'stock': 'OOS', 'modificationDate': '2022-09-30T10:55:45.000Z' }, '00194953243093': { 'value': '00194953243093', 'stock': 'OOS', 'modificationDate': '2022-10-22T11:05:54.000Z' }, '00194953243130': { 'value': '00194953243130', 'stock': 'OOS', 'modificationDate': '2022-10-22T08:55:48.000Z' } }
预期输出:
New value has been found!
第四次请求数据
{ '00194953243062': { 'value': '00194953243062', 'stock': 'OOS', 'modificationDate': '2022-10-22T12:02:06.000Z' }, '00194953243086': { 'value': '00194953243086', 'stock': 'OOS', 'modificationDate': '2022-09-30T10:55:45.000Z' }, '00194953243093': { 'value': '00194953243093', 'stock': 'OOS', 'modificationDate': '2022-10-22T11:05:54.000Z' }, '00194953243130': { 'value': '00194953243130', 'stock': 'OOS', 'modificationDate': '2022-10-22T08:55:48.000Z' } }
预期输出:
All values are OOS!
当前代码问题
我现在写的代码只检查字典键的变化,无法检测stock值的变更:
previous_data = {} gtin = # 这里是上述示例中的请求数据 if previous_data.keys() != gtin.keys(): if all(value['stock'].casefold() == 'oos' for att, value in gtin.items()): print("All values are OOS!") else: print("New value has been found!") previous_data = gtin
需要实现需求中的stock值变化检测逻辑。
解决方案
要实现需求,需要对比每次请求中每个条目stock值的变化,同时判断全局状态:
完整代码
previous_data = {} def check_stock_changes(current_data): global previous_data # 标记是否有符合条件的变化 trigger_notification = False # 首次运行,previous_data为空的情况 if not previous_data: if all(item['stock'].casefold() == 'oos' for item in current_data.values()): print("All values are OOS!") else: print("New value has been found!") previous_data = current_data.copy() return # 遍历当前所有条目,对比stock变化 for gtin_id, current_item in current_data.items(): # 处理新增的条目 if gtin_id not in previous_data: if current_item['stock'].casefold() != 'oos': trigger_notification = True continue # 获取前后的stock值(统一小写避免大小写问题) prev_stock = previous_data[gtin_id]['stock'].casefold() curr_stock = current_item['stock'].casefold() # 检测从OOS变为非OOS的情况 if prev_stock == 'oos' and curr_stock != 'oos': trigger_notification = True # 检查当前是否所有stock都是OOS all_oos_now = all(item['stock'].casefold() == 'oos' for item in current_data.values()) # 检查之前是否存在非OOS的条目 had_non_oos_before = any(item['stock'].casefold() != 'oos' for item in previous_data.values()) # 当前全为OOS且之前有非OOS条目,触发全OOS提示 if all_oos_now and had_non_oos_before: print("All values are OOS!") # 有OOS转非OOS的变化,触发补货提示 elif trigger_notification: print("New value has been found!") # 更新历史数据 previous_data = current_data.copy()
逻辑说明
- 首次运行处理:当
previous_data为空时,直接根据当前数据的全局状态输出对应信息。 - 新增条目处理:如果当前数据有新增的GTIN条目,且该条目的
stock不是OOS,则标记需要触发补货提示。 - stock值变化检测:遍历每个GTIN,对比历史和当前的
stock值,只要存在从OOS变为非OOS的情况,就标记需要触发补货提示。 - 全OOS状态判断:当当前所有
stock都是OOS,且之前存在非OOS的条目时,才打印"All values are OOS!"。 - 状态更新:每次处理完当前数据后,将
previous_data更新为当前数据的副本,确保下次对比准确。
调用示例
# 传入第一次请求数据 first_request = { '00194953243062': { 'value': '00194953243062', 'stock': 'OOS', 'modificationDate': '2022-10-22T12:02:06.000Z' }, '00194953243086': { 'value': '00194953243086', 'stock': 'OOS', 'modificationDate': '2022-09-30T10:55:45.000Z' }, '00194953243093': { 'value': '00194953243093', 'stock': 'OOS', 'modificationDate': '2022-10-22T11:05:54.000Z' }, '00194953243130': { 'value': '00194953243130', 'stock': 'OOS', 'modificationDate': '2022-10-22T08:55:48.000Z' } } check_stock_changes(first_request) # 传入第二次请求数据 second_request = { '00194953243062': { 'value': '00194953243062', 'stock': 'OOS', 'modificationDate': '2022-10-22T12:02:06.000Z' }, '00194953243086': { 'value': '00194953243086', 'stock': 'OOS', 'modificationDate': '2022-09-30T10:55:45.000Z' }, '00194953243093': { 'value': '00194953243093', 'stock': 'OOS', 'modificationDate': '2022-10-22T11:05:54.000Z' }, '00194953243130': { 'value': '00194953243130', 'stock': 'LOW', 'modificationDate': '2022-10-22T08:55:48.000Z' } } check_stock_changes(second_request)
内容的提问来源于stack exchange,提问作者PythonNewbie
相关产品推荐
相关产品推荐

