Вставка одного и того же значения несколько раз при форматировании строки

111

У меня есть строка этой формы

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

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

Goutham
источник
2
Этот %строковый оператор будет «устарел в Python 3.1 и позже удален» docs.python.org/release/3.0.1/whatsnew/… теперь мне интересно, какой способ является наиболее рекомендуемым для обеспечения совместимости версий и безопасности.
cregox
2
@Cawas Я знаю, что это довольно поздно, но мне нравится использовать str.format(). Пример:, query = "SELECT * FROM {named_arg}"; query.format(**kwargs)где query- строка формата, а kwargs- словарь с ключами, соответствующими named_args в строке формата.
Эдвин
4
@Cawas Да, кроме Адам использовал кортеж обозначения, где {0}, {1}, {2}и так далее соответствуют индексам кортежа 0, 1и 2, соответственно. В качестве альтернативы также можно назвать аргументы (например {named_arg}) и установить каждый из них в методе форматирования, например:'Hi {fname} {lname}!'.format(fname='John', lname='Doe')
Эдвин
2
@bignose Вы пометили оба вопроса как дубликаты друг друга, как google.com/…
abhi

Ответы:

203

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

incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)
Адам Розенфилд
источник
12
~ Мои личные предпочтения, result = '{st} hello world {st} hello world {st}'.format(st=incoming)
выбираю
40
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

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

Mhawke
источник
1
Ницца. Об этом забыл. locals () тоже подойдут.
Goutham
2
@Goutham: ответ Адама Розенфилда может быть лучше, если у вас актуальная версия Python.
мхок
Это действительно так. Я все еще привыкаю к ​​новым операциям форматирования строк.
Goutham
3
еще лучше, вы можете умножить базовую строку: '% (s) s hello world' * 3% {'s': 'asdad'}
dalloliogm
15

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

s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}
Лукас С.
источник
1
Кажется, очень мало смысла давать этот повторяющийся ответ. Вот еще один: '% (string_goes_here) s привет мир% (string_goes_here) s привет мир% (string_goes_here) s'% {'string_goes_here': s,}. Существует практически бесконечное количество возможностей.
mhawke
3
mhawke: я отправил сообщение до того, как мой браузер перезагрузил страницу, поэтому я не знал, что на тот момент я не знал, что на вопрос уже был дан ответ. Не нужно быть грубым человеком !!.
Лукас С.
2
@Lucas: Я полагаю, что, возможно, вам потребовалось 13 минут, чтобы ввести свой ответ :) и спасибо за голосование против ... очень признательно.
mhawke
13

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

s='foo'
string='%s bar baz %s bar baz %s bar baz' % (3*(s,))
Джеймс
источник
3
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit
Whiterocker
источник
Я предполагаю, что пример в вопросе был не о повторении «привет, мир», а о реальном шаблоне без дублирования. Вот почему я проголосовал против.
Gra
1

Fstrings

Если вы используете, Python 3.6+вы можете использовать новый так называемый, f-stringsкоторый обозначает отформатированные строки, и его можно использовать, добавив символ fв начале строки, чтобы идентифицировать это как 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-строк заключается в том, что они более читабельны, могут быть быстрее и обеспечивать лучшую производительность:

Источник Pandas для всех: анализ данных 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действительно быстрее отображают карты.

user1767754
источник