2012-02-20 42 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}