Ошибка типа: Формат требует сопоставления - PullRequest
21 голосов
/ 03 апреля 2012

У меня есть строка и список объектов:

gpl = "%(id)s : %(atr)s"

objects = [{'id':1, 'content':[{'atr':'big', 'no':2}]},  {'id':2, 'content': [{'atr':'small', 'no':3}]}]

for obj in objects:
   for con in obj['content']:
       print gpl %(obj,con)

Я получаю:

TypeError: format requires a mapping

Как мне распечатать это? Я пытаюсь напечатать:

1 : big
2 : small

Спасибо

Ответы [ 2 ]

17 голосов
/ 03 апреля 2012

Так как ваша строка форматирования использует именованные параметры:

gpl = "%(id)s : %(atr)s"

Вам необходимо предоставить ключи (имена) в словаре в качестве аргумента для ссылки на именованные ключи форматирования в строке форматирования:

print gpl % {'id': obj['id'], 'atr': con['atr']}

Итак, ваш код будет:

for obj in objects:
    for con in obj['content']:
        print gpl% {'id': obj['id'], 'atr': con['atr']}
3 голосов
/ 03 апреля 2012

Вам нужно превратить obj и con в один словарь - ваш текущий код передается в tuple.

Если вам все равно, что будет с objects впоследствии, используйте dict.update :

for obj in objects:
    for con in obj["content"]:
        con.update(obj)
        print gpl % con

1 : big
2 : small

Если вы не хотите изменять objects, вам нужно создать промежуточный словарь:

for obj in objects:
    for con in obj["content"]:
        print gpl % {'id': obj["id"], 'atr': con["atr"]}

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