Python中的简单语法错误,否则dict理解

时间:2013-07-15 22:14:31

标签: python python-3.x list-comprehension

我有一个字典和字典,值= 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是平等的。它们只是指向量和集合。

4 个答案:

答案 0 :(得分:11)

您想要实现的扩展形式是

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

其中d[k] if k in d else 0the 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}