2015-04-29 71 views
1

我使用Python 3.4,並且正在測試字典理解。Python字典理解與循環之間的區別

比方說,我有以下代碼:

listofdict = [{"id":1, "title": "asc", "section": "123"},{"id":2, "title": "ewr", "section": "456"}] 
titles1 = [] 
titles2 = [] 
titles1.append({r["section"]: r["title"] for r in listofdict}) 
print("titles1 = " + str(titles1)) 

for r in listofdict: 
    section = r["section"] 
    title = r["title"] 
    titles2.append({section: title}) 

print("titles2 = " + str(titles2)) 

我認爲這兩種方法應該給我同樣的結果,但我得到,而不是執行以下操作:

titles1 = [{'456': 'ewr', '123': 'asc'}] 
titles2 = [{'123': 'asc'}, {'456': 'ewr'}] 

titles2是我真正想要的,但我想用字典理解來做到這一點。

什麼是寫字典理解的正確方法?

+3

如果你明白究竟如何理解(任何種類的)映射到'list.append' /'set.add' /'dict [...] ... ...'/'yield'的顯式循環,這樣調試代碼更容易:只需將其轉換爲顯式循環並看看它是你想要的。關於[List Comprehensions](https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions)的教程部分實際上很好地解釋了它。 – abarnert

回答

8

你不能使用dict理解,因爲dict理解產生一個字典,其中包含從循環中獲取的鍵和值。

你會使用列表理解來代替:

[{r["section"]: r["title"]} for r in listofdict] 

這將產生一個字典每次迭代,產生一個新的列表:

>>> listofdict = [{"id":1, "title": "asc", "section": "123"},{"id":2, "title": "ewr", "section": "456"}] 
>>> [{r["section"]: r["title"]} for r in listofdict] 
[{'123': 'asc'}, {'456': 'ewr'}] 
+0

謝謝!像魅力一樣工作!應該已經意識到我想建立一個詞典列表,所以應該使用列表理解。 – jasonC