Вставка одного и того же значения несколько раз при форматировании строки - PullRequest
99 голосов
/ 04 августа 2009

У меня есть строка этого вида

s='arbit'
string='%s hello world %s hello world %s' %(s,s,s)

Все% s в строке имеют одинаковое значение (т. Е. S). Есть ли лучший способ написать это? (Вместо того, чтобы перечислять s три раза)

Ответы [ 6 ]

184 голосов
/ 04 августа 2009

Вы можете использовать расширенное форматирование строки , доступное в Python 2.6 и Python 3.x:

incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)
38 голосов
/ 04 августа 2009
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

Вы можете прочитать это, чтобы понять: Операции форматирования строки .

14 голосов
/ 04 августа 2009

Вы можете использовать словарь типа форматирования:

s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}
12 голосов
/ 04 августа 2009

Зависит от того, что вы подразумеваете под лучше. Это работает, если вашей целью является устранение избыточности.

s='foo'
string='%s bar baz %s bar baz %s bar baz' % (3*(s,))
3 голосов
/ 23 августа 2012
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit
1 голос
/ 19 декабря 2017

Fstrings

Если вы используете Python 3.6+, вы можете использовать новый так называемый f-strings, который обозначает отформатированные строки, и его можно использовать, добавив символ f в начале строки, чтобы идентифицировать его как е-строка .

price = 123
name = "Jerry"
print(f"{name}!!, {price} is much, isn't {price} a lot? {name}!")
>Jerry!!, 123 is much, isn't 123 a lot? Jerry!

Основным преимуществом использования f-строк является то, что они более читабельны, быстрее и предлагают лучшую производительность:

Исходные панды для всех: анализ данных Python, Даниэль Й. Чен

Тесты

Нет сомнений, что новые f-strings более читабельны, так как вам не нужно переназначать строки, но быстрее ли это, как указано в вышеупомянутой цитате?

price = 123
name = "Jerry"

def new():
    x = f"{name}!!, {price} is much, isn't {price} a lot? {name}!"


def old():
    x = "{1}!!, {0} is much, isn't {0} a lot? {1}!".format(price, name)

import timeit
print(timeit.timeit('new()', setup='from __main__ import new', number=10**7))
print(timeit.timeit('old()', setup='from __main__ import old', number=10**7))
> 3.8741058271543776  #new
> 5.861819514350163   #old

Запуск 10 миллионов тестов кажется, что новые f-strings на самом деле быстрее в отображении.

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