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


111

У мене є рядок такої форми

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

Усі рядки% s мають однакове значення (тобто s). Чи є кращий спосіб написання цього? (Замість того, щоб перелічувати s три рази)



2
Цей %рядковий оператор буде "застарілим на Python 3.1 та видалений пізніше через деякий час" docs.python.org/release/3.0.1/whatsnew/… тепер мені цікаво, що є найбільш рекомендованим способом сумісності версій та безпеки.
Крего

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

Відповіді:



40
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

Ви можете прочитати це, щоб зрозуміти: Операції форматування рядків .


1
Приємно. Забув про це. місцеві жителі () також будуть робити.
Гутхем

2
@Goutham: Відповідь Адама Розенфілда може бути кращою, якщо ви будете оновленою версією Python.
mhawke

Це насправді. Я все ще звикаю до нових операцій форматування рядків.
Гутхем

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 hello world% (string_goes_here) s hello world% (string_goes_here) s'% {'string_goes_here': s,}. Існує практично нескінченна кількість можливостей.
mhawke

3
mhawke: я розмістив повідомлення перед тим, як браузер перезавантажив сторінку, щоб я в той момент не знав, що на питання вже відповіли. Вам не потрібно бути грубим чоловіком !!.
Лукас С.

2
@ Лукас: Я думаю, що, можливо, вам знадобилося 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

Я здогадуюсь, що приклад у запитанні стосувався не "привіт світу", а реального шаблону без дублювання. Ось чому я виступав проти.
Гра

1

Пальчики

Якщо ви використовуєте, 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-рядків полягає в тому, що вони читаються, можуть бути швидшими та пропонують кращі показники:

Джерело Панди для всіх: Аналіз даних 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насправді швидше в картографуванні.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.