2013-03-20 54 views
0

昨天我學習了python。我試圖解析一個XML文件並將這些值放在字典中。如何在字典結尾添加值

xml.etree.ElementTree as ET 
tree = ET.parse('test.xml') 
root = tree.getroot() 
d ={ } 
for child in root: 
    d[child.tag] = child.attrib 
    print child.tag, child.attrib 
    print("\n") 
for k,v in d.items(): 
    print(k,v) 

現在聲明d[child.tag] = child.attrib正在被重寫,而不是被更新。

所以我得到的輸出 -

country {'name': 'Liechtenstein'} 
country {'name': 'Singapore'} 
country {'name': 'Panama'} 

('country', {'name': 'Panama'}) 

前三行輸出的是由於print()。最後一行來自字典。

我怎樣纔能有效地做到這一點,以便我的字典存儲所有三行?

+0

你想讓你的答案結果是什麼格式? – drewmm 2013-03-20 06:43:45

+0

無需特定格式。任何事情都會做。我只想把所有的三個國家的價值都保存下來。 – Abhishek 2013-03-20 06:49:59

回答

2

你可以使用collections.defaultdict

from collections import defaultdict 

d = defaultdict(list) 
for child in root: 
    d[child.tag].append(child.attrib) 

如果所有root的直接子具有相同的標籤,那麼你可以只使用一個列表:

L = [child.attrib for child in root] 
1

標準Python dict是無序的 - 所以,除非你使用Python 3.1中提供的OrderedDict,否則你不能。

+0

[OrderedDict](http://docs.python.org/2.7/library/collections.html#collections.OrderedDict)在Python 2.7中可用。有一個老版本的配方。 – jfs 2013-03-20 06:47:37

0

確定。如果你唯一的目標是拯救這三個國家,你最好使用一個列表而不是字典。字典用於將鍵與值相關聯,並且鍵必須是不同的。你每次都使用name作爲關鍵,這就是爲什麼每個條目都覆蓋前者。

因此,你可以不喜歡

d = [] 
for child in root: 
    d.append(child.attrib) 

如果你確實有不同的鍵要爲特定值相關聯,那麼你可以使用的字典。但是你必須能夠保證密鑰是不同的。

-2

爲您的字典中的每個鍵存儲一個列表,將新城市/任何附加到該列表中。

+0

對那些低估了我的回答的人來說,它和@J.F完全一樣。塞巴斯蒂安的回答(接受的答案)。這個想法是將每個字典鍵映射到一個列表,而不是替換(鍵,值)對(它不適用於OP,因爲他有相同鍵的多個值),將每個新值附加到鍵的列表。 – erjoalgo 2013-04-28 07:47:19