字典理解:更改列表值中的最后一项

Dictionary comprehension: change the last item in a list value

我有一个 Python 字典将字符串映射到字符串列表。

例如对于这个例子

dd = {'cc': ['aa', 'UU', 'zzzzzzz'], 't': ['aa', 'uu', 'ZZZZZZ']}

我想要这个:

{'cc': ['aa', 'UU', 'ZZZZZZZ'], 't': ['aa', 'uu', 'ZZZZZZ']} # note the last item in the first list 

我想我可以通过索引重新分配最后一项,并尝试了这个的变体

{k: (v[-1] = v[-1].upper()) for k,v in dd.viewitems()} 
# --> returns syntax error
# or this, which returns None:
{k: v[:-1].append(v[-1].upper()) for k,v in dd.viewitems()}
#the below works but I don't like it
{k: [i if not v.index(i) == len(v)-1 else i.upper() for i in v] for k,v in dd.viewitems()}

我无法让它工作 w/out 一个肮脏的列表理解。

(我在 Py 2 上虽然不是我自己的错)

谢谢!

你可以使用解包:

dd = {'cc': ['aa', 'UU', 'zzzzzzz'], 't': ['aa', 'uu', 'ZZZZZZ']}
new_d = {a:[c, d, e.upper()] for a, [c, d, e] in dd.items()}

输出:

{'cc': ['aa', 'UU', 'ZZZZZZZ'], 't': ['aa', 'uu', 'ZZZZZZ']}

但是,对于包含任意数量元素的列表,您可以使用负索引:

new_d = {a:b[:-1]+[b[-1].upper()] for a, b in dd.items()}

使用简单的 for 循环:

dd = {'cc': ['aa', 'UU', 'zzzzzzz'], 't': ['aa', 'uu', 'ZZZZZZ']}

for v in dd.itervalues():
    v[-1] = v[-1].upper()

print dd

{'cc': ['aa', 'UU', 'ZZZZZZZ'],
 't': ['aa', 'uu', 'ZZZZZZ']}

字典理解不能包含赋值,因此不适合您尝试应用的逻辑。