我有一个字典和字典,值= 5
v = s = {'a', 'b', 'c'}
d = {'b':5 //<--new value}
如果字典d中的键'b'例如在set s中,那么我想在返回字典理解时使该值等于新值,或者如果set s中的键不在字典d中则使该值等于0 。所以这是我的代码,在s ['b'] = 5并且我的新词典是......
{'a':0, 'b':5, 'c':0}
我写了一个词典理解
{ k:d[k] if k in d else k:0 for k in s}
^
SyntaxError: invalid syntax
为什么?我很生气它不起作用。这就是你在python中做的其他方法吗?
对不起大家。对于那些访问过这个页面的人,我最初放了{k:d [k]如果k in v else k:0 for k in v}而s ['b'] = 5只是表示我创建的新词典会有一个关键'b'等于5,但它不正确你不能迭代这样的一套。
所以重申v和s是平等的。它们只是指向量和集合。
答案 0 :(得分:11)
您想要实现的扩展形式是
a = {}
for k in v:
a[k] = d[k] if k in d else 0
其中d[k] if k in d else 0
为the Python's version of ternary operator。看到?您需要从表达式的右侧部分删除k:
:
{k: d[k] if k in d else 0 for k in v} # ≡ {k: (d[k] if k in d else 0) for k in v}
你可以像
一样简洁地写出来a = {k: d.get(k, 0) for k in d}
答案 1 :(得分:3)
In [82]: s = {'a', 'b', 'c'}
In [83]: d = {'b':5 }
In [85]: {key: d.get(key, 0) for key in s}
Out[85]: {'a': 0, 'b': 5, 'c': 0}
答案 2 :(得分:3)
这可以解决您的问题:
>>> dict((k, d.get(k, 0)) for k in s)
{'a': 0, 'c': 0, 'b': 5}
答案 3 :(得分:2)
您不能将三元if
表达式用于name:value对,因为name:value对不是值。
你可以分别对值或键使用if
表达式,这似乎正是你想要的:
{k: (d[k] if k in v else 0) for k in v}
然而,这有点愚蠢。您正在执行for k in v
,因此根据定义,每个k
都位于v
。也许你想要这个:
{k: (d[k] if k in v else 0) for k in d}