You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python字典缺失stock字段时标记为0,解决casefold属性错误

问题解决:字典对比时的casefold调用错误

错误原因

你的代码报错是因为data_1.get(att, {}).get('stock', {})这行逻辑存在问题:当data_1中不存在对应att的键时,第一个get返回空字典;接着第二个get找不到stock字段时,又返回空字典。而字典对象没有casefold方法,因此触发了'dict' object has no attribute 'casefold'错误。

修改方案

按照需求,未找到stock字段时要标记为0,对应STOCK_MAP里的'oos'(值为0)。所以需要把get('stock')的默认值设为'oos',而非空字典,确保casefold调用的对象始终是字符串。

修改后的代码

简洁版

STOCK_MAP = {
    'oos': 0,
    'low': 1,
    'medium': 2,
    'high': 3
}

data_1 = {}

data2 = {
    '123456789':
        {
            'levels': '123456789',
            'stock': 'LOW',
        }
}

# 调整get的默认值为'oos',保证casefold调用对象是字符串
t = any(
    STOCK_MAP[value['stock'].casefold()] > 
    STOCK_MAP[data_1.get(att, {}).get('stock', 'oos').casefold()] 
    for att, value in data2.items()
)
print(t)  # 输出True

更易读版(拆分逻辑,便于后续维护)

STOCK_MAP = {
    'oos': 0,
    'low': 1,
    'medium': 2,
    'high': 3
}

data_1 = {}

data2 = {
    '123456789':
        {
            'levels': '123456789',
            'stock': 'LOW',
        }
}

t = False
for att, value in data2.items():
    # 获取当前库存等级对应的数值
    current_level = STOCK_MAP[value['stock'].casefold()]
    # 获取之前的库存等级,不存在则用oos(对应0)
    prev_item = data_1.get(att, {})
    prev_stock = prev_item.get('stock', 'oos').casefold()
    prev_level = STOCK_MAP[prev_stock]
    if current_level > prev_level:
        t = True
        break  # 符合any逻辑,找到一个满足条件就停止循环

print(t)  # 输出True

效果说明

修改后,当data_1中没有对应商品的库存数据时,会默认使用'oos'对应的0值进行对比,既避免了报错,也满足了“未找到变量时标记为0”的需求。运行代码后会正确输出True,因为当前库存等级LOW(对应1)高于默认的0值。

内容的提问来源于stack exchange,提问作者PythonNewbie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 16:35:50