如何根据包含分隔符的键打印dict值

时间:2012-03-08 06:06:22

标签: python dictionary

其实我有一个词典

x1={'b;0':'A1;B2;C3','b;1':'aa1;aa2;aa3','a;1': 'a1;a2;a3', 'a;0': 'A;B;C'}

实际上我的约定是'a;0','b;0'将包含标签,'a;1','b;1'将具有相应的值,基于此我必须分组和打印。 从这个词典我想要的输出是

<a>       #this is group name
<A>a1</A> # this are tags n values
<B>a2</B>
<C>a3</C>
</a>
<b>
<A1>aa1</A1>
<B2>aa2</B2>
<C1>aa3</C1>
</b>

这是我给出的样本字典,许多团体可能会像c;0:.... d;0.....

一样

我正在使用代码     A = []     B = []     C = []     d = []     E = []     for k,v in x1.iteritems():       如果k.split(“;”)。count('0')== 1:#我正在使用这个bcoz a; 0,b; 0包含标签,所以我检查它们是否包含零分割它。         a = k.split(“;”)#this包含a = ['a','0','b','0']         b = v.split(“;”)#这包含'a; 0','b; 0'值       其他:         c = v.split(“;”)#这包含'a; 1','b; 1'值         对于范围内的i(0,len(b)):                         d = B [i]于                         E = C [1]             打印“&lt;%s&gt;%s&lt;%s&gt;”%(c,e,c) 实际上,当单个组进入时,此代码仅工作50%     dict('a; 1':'a1; a2; a3','a; 0':'A; B; C')当多个群体进入时     dict('b; 0':'A1; B2; C3','b; 1':'aa1; aa2; aa3','a; 1':'a1; a2; a3','a; 0': 'A; B; C') 在两种情况下都打印          AA1     AA2     AA3      它只打印最近的值并非所有值

1 个答案:

答案 0 :(得分:1)

请注意:词典没有订单。所以iteritems()循环不一定以'b; 0'开头。试试例子

for k,v in x1.iteritems():
    print k

看。在我的电脑上,它给出了

a;1
a;0
b;0
b;1

这会产生一个问题,因为您的代码假定键按照它们出现在x1定义中的顺序[编辑:或者说它们按顺序排列]。你可以,例如迭代已排序的键:

for k in sorted(x1.keys()):
    v = x1[k]
    print k, v

然后解决订单问题。但我认为你的代码中存在更多问题。

编辑:数据结构:

以某种方式存储数据可能更好,例如

 x1 = {'a': [('A','a1'),('B','a2'),('C','a3')], 'b': ... }

如果您无法更改格式,则可以转换数据:

x1f = {}
for k in x1.iterkeys():
    tag, id = k.split(';')
    if int(id) == 0:
        x1f[tag] = zip(x1[k].split(';'), x1[tag+';'+'1'].split(';'))
print x1f

从那里可以更容易地转换为所需的输出。

并且取决于您是否希望将来扩展输出的复杂性, 你可能想考虑使用pyxml:

from xml.dom import minidom
doc = minidom.Document()

然后你可以使用createElement和appendChild方法。