2011-03-08 31 views
10

如何快譯通與dict的列表轉換轉換。下面是字典的如何字典的名單與dict

data = [{'name': 'John Doe', 'age': 37, 'sex': 'M'}, 
     {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'}, 
     {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}] 

使用名稱作爲新的密鑰

data = {{'name': 'John Doe', 'age': 37, 'sex': 'M'}, 
     {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'}, 
     {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}} 
+1

嘗試把你的第二個行Python腳本並運行它。它會運行正常嗎?我不這麼認爲...... – 2011-03-08 17:52:27

+13

你的問題並沒有真正意義上的發佈。你想要結果字典的鍵和相關值是什麼?你寫的第二件事不是一個有效的Python對象。 – dfan 2011-03-08 17:53:24

+0

http://docs.python.org/tutorial/datastructures.html#dictionaries – 2011-03-08 17:54:03

回答

24

一個可能的解決方案列表:

new_dict = {} 
for item in data: 
    name = item['name'] 
    new_dict[name] = item 

與Python 3.x中,你還可以使用字典內涵的相同的方法以更好的方式:

new_dict = {item['name']:item for item in data} 

正如保羅·麥圭爾評論建議,如果你不想在內部字典的名稱,你可以這樣做:

new_dict = {} 
for item in data: 
    name = item.pop('name') 
    new_dict[name] = item 
+1

這將留下一個額外的名稱字段,這可能是也可能不是用戶想要什麼。 (即新字典的樣子'{ '麗莎·辛普森':{ '名': '麗莎·辛普森', '年齡':17, '性': 'F'} ...}') – 2011-03-08 18:04:01

+0

附加「項目。 pop('name')「,然後你不會得到額外的名字字段。 – PaulMcG 2011-03-08 18:09:47

+0

是的,我沒有把它作爲額外的名字。 – sush 2011-03-08 18:09:48

1

也許你想要的名稱是關鍵?你沒有真正指出,因爲你的第二個例子是無效的,並沒有真正意義。

注意我的示例從值,這可能需要(或者也許不是)的鍵「name」。

data = [{'name': 'John Doe', 'age': 37, 'sex': 'M'}, 
     {'name': 'Lisa Simpson', 'age': 17, 'sex': 'F'}, 
     {'name': 'Bill Clinton', 'age': 57, 'sex': 'M'}] 
newdata = {} 
for entry in data: 
    name = entry.pop('name') #remove and return the name field to use as a key 
    newdata[name] = entry 
print newdata 
##{'Bill Clinton': {'age': 57, 'sex': 'M'}, 
## 'John Doe': {'age': 37, 'sex': 'M'}, 
## 'Lisa Simpson': {'age': 17, 'sex': 'F'}} 
print newdata['John Doe']['age'] 
## 37 

另外要注意,Lisa是不是17路年輕,所以甚至不覺得它竊聽的。 ;)

+0

這取決於你如何解釋辛普森時間。畢竟,如果1989年的演出開始時她是8歲,她今天會是29歲或30歲...... :-) – 2011-03-08 18:13:10

15

如果類型的字典難道不共享密鑰,那麼你可以使用:

dict([(key,d[key]) for d in data for key in d] 

可能是它更好地在你的情況下生成列表作爲值的字典?

newdict={} 
for k,v in [(key,d[key]) for d in data for key in d]: 
    if k not in newdict: newdict[k]=[v] 
    else: newdict[k].append(v) 

這產生了:

>>> newdict 
`{'age': [37, 17, 57], 'name': ['John Doe', 'Lisa Simpson', 'Bill Clinton'], 'sex': ['M', 'F', 'M']}`