2013-03-20 57 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