2012-08-30 48 views
5

(對不起,無法抗拒的雙關語!)Python的字典不解

我不知道爲什麼它似乎無法翻譯:

dict([(str(x),x) if x % 2 else (str(x),x*10) for x in range(10)]) 

到這個更具可讀性的表達,用字典的理解:

{str(x):x if x % 2 else str(x):x*10 for x in range(10)} 
+0

作爲一個側面說明,第一個可以寫成:'字典((STR(X),X,如果我%2否則x * 10)對於範圍(10)中的x)'與thg435的解決方案對稱。 (我也將list-comp改成了一個生成器,因爲......爲什麼不呢?) – mgilson

回答

8
{ str(x):(x if x % 2 else x*10) for x in range(10) } 

似乎運作良好

+6

我的建議'{str(x):(x如果x%2 else x * 10)for x in range(10)}' - 更可讀的 –

+0

@AlexeyKachayev:[本網站是協作編輯](http://stackoverflow.com/faq),你不知道嗎?如果你有一個有用的建議,只需編輯帖子! – georg

+0

請注意,詞典理解僅適用於v2.7 + –

1

設置優先級以便if .. else不適用於整個key:value對:它只是值的一部分。這意味着你要:

{str(x): (x if x % 2 else x*10 for x in range(10))} 

在你想要一個不同的密鑰計算,以及不同的值,在某些情況下不太可能發生,你會做這樣的:

{(str(x) if x % 2 else repr(x)) : x if x % 2 else x * 10 } 

這將等同於:

dict([(str(x),x) if x % 2 else (repr(x),x*10) for x in range(10)]) 

或者決定一個明確的環比一個班輪的東西太複雜更具可讀性。

1

看起來它只是一個問題或正確分組表達式:

# original 
{str(x): (x if x % 2 else x*10) for x in range(10)} 

# slightly more complex, allowing both key and value to have the ternary 
{(str(x) if x % 3 else str(x+1)) : (x if x % 2 else x*10) for x in range(10)}