如何用字典推导式修改Python字典中列表的最后一个元素为大写?
优雅实现字典列表最后一个元素转大写(Python 2)
嘿,我来帮你搞定这个问题~你想要用字典推导式优雅地把每个列表的最后一个元素转大写,其实有个非常简洁高效的方法,先直接给你看最优写法:
dd = {'cc': ['aa', 'UU', 'zzzzzzz'], 't': ['aa', 'uu', 'ZZZZZZ']} new_dd = {k: v[:-1] + [v[-1].upper()] for k, v in dd.iteritems()} print(new_dd) # 输出: {'cc': ['aa', 'UU', 'ZZZZZZZ'], 't': ['aa', 'uu', 'ZZZZZZ']}
为什么这个写法可行?
v[:-1]会生成原列表去掉最后一个元素的新列表(不会修改原列表)[v[-1].upper()]把最后一个元素转成大写后做成单元素列表- 用
+把这两部分拼接起来,就得到了最后一个元素大写的新列表
分析你之前的错误写法
语法错误的写法:
{k: (v[-1] = v[-1].upper()) for k,v in dd.viewitems()}字典推导式的value部分需要是一个表达式,而你这里用了赋值语句
v[-1] = ...,这不符合Python语法规则,所以会报错。返回None的写法:
{k: v[:-1].append(v[-1].upper()) for k,v in dd.viewitems()}append()方法是原地修改列表,它的返回值是None,所以最终字典里的每个value都会变成None,这显然不是你想要的结果。可行但不够优雅的写法:
{k: [i if not v.index(i) == len(v)-1 else i.upper() for i in v] for k,v in dd.viewitems()}这个写法有两个问题:
- 如果列表里有重复元素,
v.index(i)会返回第一个匹配元素的索引,可能导致错误地修改非最后一个元素 - 每次循环都调用
index(),会额外遍历列表,效率比切片拼接低很多
- 如果列表里有重复元素,
额外补充:处理空列表的情况
如果你的字典里可能存在空列表,可以加个判断让代码更健壮:
new_dd = {k: v[:-1] + [v[-1].upper()] if v else v for k, v in dd.iteritems()}
内容的提问来源于stack exchange,提问作者patrick
相关产品推荐
相关产品推荐

