2013-07-15 71 views
1

我有一組和字典和值= 5簡單的語法錯誤,如果其他字典理解

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

如果鍵「B」在例如字典d是集當時的我要打該值等於我返回詞典理解時的新值,或者如果集合s中的鍵不在詞典中,則爲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是平等的。他們只是意味着矢量和集合。

+1

你的描述很迷茫。如果's'是一個集合,'['b']'沒有任何意義。另外,「v」應該是什麼?它是'''?或者有些不同? – abarnert

+0

對不起,這是v應該是s。我在做Python的矢量作業 – Leon

回答

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

對於名稱:值對,您不能使用三元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} 
+0

這似乎只給我回原始字典 – Leon

+1

@Leon:是的,正如我所解釋的,「這是一種愚蠢的做法,你正在爲v做'k',所以每個'k'都在定義爲'v'。「這正是你想要在你的問題中做的事情,這可能不是你想做的事情,但很難猜測你想要做什麼而不去理解你的想法。 – abarnert

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} 
+0

不是他想要的。他正在檢查v中的k,而不是d中的k。如果'v'和'k'是相同的字典,沒有任何理由做任何檢查,因爲'key'將始終存在。 – abarnert

3

這應該解決您的問題:

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