【问题标题】:Python conditional dictionary comprehensionPython条件字典理解
【发布时间】:2012-02-20 23:57:32
【问题描述】:

此列表组合起作用是否有原因:

N = 5
d = {0:100, 2:5}
[(dpidx,d[dpidx]) if dpidx in d else (dpidx,dpidx) for dpidx in range(N)]

[(0, 100), (1, 1), (2, 5), (3, 3), (4, 4)]

但是这个 dict comp 不起作用? :

{dpidx:d[dpidx] if dpidx in d else dpidx:dpidx for dpidx in range(N)}

{dpidx:d[dpidx] if dpidx in d else dpidx:dpidx for dpidx in range(N)}
                                        ^
SyntaxError: invalid syntax

我正在寻找:

{0: 100, 1: 1, 2: 5, 3: 3, 4: 4}

我认为我可以只使用 dict comp 而不是 dict(list comp)。

提前致谢!

【问题讨论】:

  • 我不确定“字典”理解是不是一件事......
  • 为什么不{dpidx:d.get(dpidx,dpidx) for dpidx in range(N)}
  • 字典推导是 Python 3.x 和 2.7 中的新功能。
  • 请注意,您可以通过 dict( (dpidx,d[dpidx]) if dpidx in d else (dpidx,dpidx) for dpidx in range(N) ) 将您的第一个列表 comp 变成一个 dict,因为这是我的问题:为什么要添加 dict comp 语法?
  • @Dan D. 因为它更简洁,可以在本机代码中实现。也因为不需要创建惰性生成器,这意味着管理它的状态会产生一些开销。最后但并非最不重要的一点是,随之而来的是拥有同样强大的构造来创建最基本的内置集合类型、列表和字典。

标签: python dictionary list-comprehension


【解决方案1】:

你不能重复这个键。字典理解的形式为

{k: v for ...}

其中kv 是表达式。这些表达式中的一个(或两个)可以是条件表达式,它将给出

{dpidx:d[dpidx] if dpidx in d else dpidx for dpidx in range(N)}

k: v 本身并不是一个表达式。

更简单的写法是

{dpidx:d.get(dpidx, dpidx) for dpidx in range(N)}

【讨论】:

  • 当然,在这种特殊情况下,您可以写成{ dpidx: d.get(dpidx, dpidx) for dpidx in range(N) }
【解决方案2】:

您需要将 dpidx:dpidx 更改为 dpidx

记住“d[dpidx] if dpidx in d else dpidx”表示字典中的值如果存在,否则为dpidx的值”,“否则为dpidx的值:dpidx”没有意义

d={1:2,3:5}
N=5

g={dpidx: d[dpidx] if dpidx in d else dpidx for dpidx in range(N)}

print g
>>>
{0: 0, 1: 2, 2: 2, 3: 5, 4: 4}

【讨论】:

    猜你喜欢
    • 2012-05-20
    • 2015-09-26
    • 2013-01-08
    • 1970-01-01
    • 2022-11-22
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多