Python中使用列表推导式遍历字典并更新值的语法问题求助
问题分析与解决办法
首先得帮你揪出代码里的两个小问题:
- 字典定义的语法错误
你写的flowers = {'rose':0,'cose:0','mose:0'}格式不对,字典的每个键值对必须是'键': 值的结构,你这里'cose:0'和'mose:0'既没正确闭合引号,也没把键和值分开,正确的写法应该是:
flowers = {'rose':0, 'cose':0, 'mose':0}
- 列表推导式的误用
你想用[flowers[i] = 1 for i in states[1] if i in flowers.keys()]来修改字典,但列表推导式的核心作用是生成新列表,它里面只能放表达式,不能放赋值语句(flowers[i] = 1是赋值语句,不属于表达式范畴),所以才会触发语法错误。
正确的实现方式
方式一:普通for循环(最直观易读,推荐日常使用)
逻辑清晰,出错概率低,维护起来也方便:
states = ('ab', ['rose', 'cose']) flowers = {'rose':0, 'cose':0, 'mose':0} for flower in states[1]: if flower in flowers: # 不用写.keys(),直接判断键是否存在更简洁 flowers[flower] = 1 print(flowers) # 输出: {'rose': 1, 'cose': 1, 'mose': 0}
方式二:字典推导式生成新字典(不修改原字典)
如果不想改动原字典,而是生成一个全新的更新后字典,可以用这种方式:
states = ('ab', ['rose', 'cose']) original_flowers = {'rose':0, 'cose':0, 'mose':0} updated_flowers = {k: 1 if k in states[1] else v for k, v in original_flowers.items()} print(updated_flowers) # 输出: {'rose': 1, 'cose': 1, 'mose': 0}
方式三:用map函数(简洁但可读性稍弱)
这种写法相对小众,适合追求代码简洁的场景,但不如for循环直观:
states = ('ab', ['rose', 'cose']) flowers = {'rose':0, 'cose':0, 'mose':0} list(map(lambda x: flowers.update({x:1}), filter(lambda x: x in flowers, states[1]))) print(flowers) # 输出: {'rose': 1, 'cose': 1, 'mose': 0}
内容的提问来源于stack exchange,提问作者Paul Alwin
相关产品推荐
相关产品推荐

