如何基于network键值定制修改字典元素生成product字段
用字典映射规则批量处理字典列表字段
现有列表list_a,每个元素是包含title、network字段的字典。需求是根据network的不同取值,对title执行对应字符串处理(比如network_one对应split('(')[0].title().rstrip(),network_two对应split('-')[0].lower().rstrip()),生成新的product字段。已知用if-else可以实现,但希望用字典管理规则以适配大量数据场景,当前尝试的keys_dict写法有误,寻求正确实现方式。
预期输出
l = [ {'title': 'some product name ()', 'network': 'network_one', 'product': 'Some product name'}, {'title': 'another product name - some more', 'network': 'network_two', 'product': 'another product name'} ]
当前错误代码
list_a = [ {'title': 'some product name ()', 'network': 'network_one'}, {'title': 'another product name - some more', 'network': 'network_two'} ] keys_dict = { 'network_one': items['title'].split('(')[0].title().rstrip(), # 这里错误,此时items未定义 'network_two': items['title'].split('-')[0].lower().rstrip(), } l = [] for items in list_a: if items['network'] in keys_dict: items['product'] = keys_dict[items['network']] l.append(items) print(l)
正确实现方式
错误原因在于keys_dict中直接写了依赖items的表达式——定义字典时items还未遍历到,根本不存在。正确的做法是把每个处理逻辑包装成函数,让字典存储的是函数而非直接计算的结果,遍历的时候再传入当前元素的title执行计算。
完整代码
list_a = [ {'title': 'some product name ()', 'network': 'network_one'}, {'title': 'another product name - some more', 'network': 'network_two'} ] # 规则字典:key是network值,value是接收title参数的处理函数 process_rules = { 'network_one': lambda title: title.split('(')[0].title().rstrip(), 'network_two': lambda title: title.split('-')[0].lower().rstrip() } result = [] for item in list_a: network = item['network'] if network in process_rules: # 取出对应函数,传入title计算product值 item['product'] = process_rules[network](item['title']) result.append(item) print(result)
扩展说明
如果处理逻辑比较复杂,不适合用lambda表达式,可以定义普通函数:
def process_network_one(title): return title.split('(')[0].title().rstrip() def process_network_two(title): return title.split('-')[0].lower().rstrip() process_rules = { 'network_one': process_network_one, 'network_two': process_network_two }
这种方式更易维护,适合复杂的字符串处理逻辑。
内容的提问来源于stack exchange,提问作者Michal
相关产品推荐
相关产品推荐

