У меня есть ниже вложенный dict d:

{
 1: {1: {'text': 'Contact', 'x0': Decimal('21.600')}},
 2: {1: {'text': 'My mail is', 'x0': Decimal('21.600')},
     2: {'text': 'domain@example.com', 'x0': Decimal('223.560')}}
}

Я пытаюсь «объединить» вложенные словари для каждого ключа верхнего уровня в строку (которая должна сформировать предложение). Например:

1: Contact
2: My mail is domain@example.com

Поэтому я немного сомневаюсь, как это сделать в Python. Вот что у меня сейчас:

for line in d:
    for word_no, text in d[line].items():
        print(text['text'])

Это печатает каждую строку text, но ничего не объединяет. Кто-нибудь может направить меня в правильном направлении?

1
oliverbj 1 Июл 2019 в 11:30

3 ответа

Лучший ответ

Вам просто нужна еще одна итерация.

< Сильный > Пример:

from decimal import Decimal

d = {
 1: {1: {'text': 'Contact', 'x0': Decimal('21.600')}},
 2: {1: {'text': 'My mail is', 'x0': Decimal('21.600')},
     2: {'text': 'domain@example.com', 'x0': Decimal('223.560')}}
}

for k, v in d.items():
    print("{}: {}".format(k, " ".join(n["text"] for _, n in v.items())))   #Combine "text"

< Сильный > Вывод :

1: Contact
2: My mail is domain@example.com
1
Rakesh 1 Июл 2019 в 08:34

Пары ключ и значение в словаре расположены не в определенном порядке. Если упорядочение ваших предложений / слов является значительным, вы должны отсортировать значения dict по ключам (используя отсортировано ( ) ) . Для объединения строк используйте функцию str.join () со списком подстрок в качестве аргумента.

Это упрощенная версия с использованием конкатенации списков:

for i in sorted(d.keys()):
    print '%s: %s' % (i, ' '.join([d[i][u]['text'] for u in sorted(d[i].keys())]))

И это более многословная версия:

for i in sorted(d.keys()):
    texts = []
    for u in sorted(d[i].keys()):
        texts.append(d[i][u]['text'])
    print '%s: %s' % (i, ' '.join(texts))
0
Peter Svac 1 Июл 2019 в 08:54

Попробуй это,

>>> from decimal import Decimal

>>> d = {
 1: {1: {'text': 'Contact', 'x0': Decimal('21.600')}},
 2: {1: {'text': 'My mail is', 'x0': Decimal('21.600')},
     2: {'text': 'domain@example.com', 'x0': Decimal('223.560')}}
}

>>> for k,v in d.items():
    s = ""
    for ik,iv in v.items():
        s+=" "+iv['text']
    print("{}: {}".format(k,s))

< Сильный > Вывод :

1:  Contact
2:  My mail is domain@example.com
0
shaik moeed 1 Июл 2019 в 08:37