【问题标题】:Simple syntax error in Python if else dict comprehensionPython中的简单语法错误if else dict理解
【发布时间】:2013-07-13 22:38:17
【问题描述】:

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

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

例如,如果字典 d 中的键 'b' 在 set s 中,那么当我返回 dict 理解时,我想让该值等于新值;如果 set s 中的键不在字典 d 中,则为 0 .所以这是我的代码,其中 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中的else不是这样,你会怎么做??

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

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

【问题讨论】:

  • 你的描述很混乱。如果s 是一个集合,那么s['b'] 没有任何意义。另外,v 应该是什么?是s吗?还是有什么不同?
  • 对不起,v 应该是 s。我在做python矢量作业

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


【解决方案1】:

你想要达到的扩展形式是

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}

【讨论】:

    【解决方案2】:

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

    >>> dict((k, d.get(k, 0)) for k in s)
    {'a': 0, 'c': 0, 'b': 5}
    

    【讨论】:

      【解决方案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}
      

      【讨论】:

      • 不是他想要的。他正在检查k in v,而不是k in d。如果vk 是同一个字典,则没有理由进行任何检查,因为那样key 将始终存在。
      【解决方案4】:

      您不能将三元 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}
      

      【讨论】:

      • 这似乎只是把原来的字典还给我
      • @Leon:是的,正如我解释的那样,“这有点傻。你在做for k in v,所以每个k 都在v 中。”这正是您在问题中尝试做的事情,这可能不是您想做的事情,但是如果不读心,很难猜出您想做的事情。
      猜你喜欢
      • 2015-04-19
      • 2017-07-15
      • 1970-01-01
      • 2012-03-31
      • 2015-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多