2012-02-20 46 views
1

是否有一个原因,为什么这个名单补偿工作:Python的条件字典解析

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)] 

但这字典补偿不起作用? :

{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} 

我以为我可以只使用一个字典比较,而不是一个字典(名单COMP)。

在此先感谢!

+0

‘dpidx字典’的理解是一个东西... – jondavidjohn 2012-02-20 23:59:12

+1

为什么不是'{dp idx:d.get(dpidx,dpidx)为范围(N)中的dpidx}'? – 2012-02-21 00:02:02

+3

词典解析是Python 3.x和2.7中的新增功能。 – 2012-02-21 00:02:33

回答

9

您无法重复该密钥。字典解析的形式

{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)} 
+2

当然,在这种情况下,您可以将它写为'{dpidx:d.get(dpidx,dpidx),范围为(N)}' – 2012-02-21 00:03:10

+0

谢谢你们! – jkmacc 2012-02-21 03:03:35

0

您需要更改dpidx:dpidx只是dpidx

记住 “d [dpidx如果dpidx在d其他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}