1

我有一个集合和字典,一个值 = 5

v = s = {'a', 'b', 'c'}
d = {'b':5 //<--new value}

例如,如果字典 d 中的键“b”在 set s 中,那么当我返回 dict 理解时,我想让该值等于新值;如果 set s 中的键不在字典 d 中,则我希望使该值等于新值。所以这是我的代码在 s['b'] = 5 和我的新字典是......

{'a':0, 'b':5, 'c':0}

我写了一个dict理解

{  k:d[k] if k in d else k:0 for k in s}
                          ^
SyntaxError: invalid syntax

为什么?!我很生气它不起作用。如果在python中不是这样,这就是你的做法?

所以对不起大家。对于那些访问过这个页面的人,我最初把 { k:d[k] if k in v else k:0 for k in v} 和 s['b'] = 5 只是我创建的新字典的一个表示一个键 'b' 等于 5,但它不正确,因为你不能像这样迭代一个集合。

所以重申v和s是相等的。它们只是表示向量和集合。

4

4 回答 4

11

您要实现的扩展形式是

a = {}
for k in v:
    a[k] = d[k] if k in d else 0

Python 版本的三元运算符d[k] if k in d else 0在哪里。看?您需要从表达式的右侧删除: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}
于 2013-07-15T22:23:18.570 回答
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}
于 2013-07-15T22:21:11.113 回答
3

这应该可以解决您的问题:

>>> dict((k, d.get(k, 0)) for k in s)
{'a': 0, 'c': 0, 'b': 5}
于 2013-07-15T22:23:52.667 回答
2

您不能对名称:值对使用三元if表达式,因为名称:值对不是值。

可以分别对值或键使用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}
于 2013-07-15T22:20:49.837 回答