2015-11-12 3 views
4

Я хочу заполнить строку с определенным форматом. Когда у меня есть одно значение, то легко построить его:Создание строки с использованием списка значений

>>> x = "there are {} {} on the table.".format('3', 'books') 
>>> x 
'there are 3 books on the table.' 

но что, если у меня есть длинный список объектов

items =[{'num':3, 'obj':'books'}, {'num':1, 'obj':'pen'},...] 

и я хочу построить предложение в точно так же:

There are 3 books and 1 pen and 2 cellphones and... on the table 

Как я могу это сделать, учитывая, что я не знаю длины списка? С помощью format я мог бы легко построить строку, но тогда я должен заранее знать длину списка.

ответ

6

Используйте str.join() call с list comprehension* застроить объекты часть:

objects = ' and '.join(['{num} {obj}'.format(**item) for item in items]) 

затем интерполировать, что в полном предложении:

x = "There are {} on the table".format(objects) 

Демо:

>>> items = [{'num': 3, 'obj': 'books'}, {'num': 1, 'obj': 'pen'}, {'num': 2, 'obj': 'cellphones'}] 
>>> objects = ' and '.join(['{num} {obj}'.format(**item) for item in items]) 
>>> "There are {} on the table".format(objects) 
'There are 3 books and 1 pen and 2 cellphones on the table' 

* Вы могли использовать generator expression, но для str.join() вызова a list comprehension happens to be faster.

+0

mind = blow. Это так просто и красиво – letsc

+1

Martijn, почему понимание списка, а не выражение генератора в качестве параметра 'str.join'? –

+0

@ Robᵩ Потому что 'join' преобразует выражение генератора в список по себе. И, передав выражение генератора для объединения, вы заставите' join' выполнять эту работу! – Kasramvd

Смежные вопросы