как напечатать значения dict на основе ключа, содержащего разделители - PullRequest
0 голосов
/ 08 марта 2012

На самом деле у меня есть dict

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 = [] для k, v в x1.iteritems (): если k.split (";"). count ('0') == 1: # i amиспользуя этот bcoz a; 0, b; 0 содержит тег, поэтому я проверяю, содержат ли они ноль, разделяем его.a = k.split (";") # это содержит a = ['a', '0', 'b', '0'] b = v.split (";") # это содержит 'a; 0', значения 'b; 0' else: c = v.split (";") # содержит значения 'a; 1', 'b; 1' для i в диапазоне (0, len (b)): d = b[i] e = c [i] print "<% s>% s <% s>"% (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 Ответ

1 голос
/ 08 марта 2012

Имейте в виду: словари не имеют порядка.Таким образом, цикл 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...