문자열을 형식화 할 때 동일한 값을 여러 번 삽입


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/… 이제 버전 호환성과 보안을 위해 가장 권장되는 방법이 무엇인지 궁금합니다.
cregox 2010

2
@Cawas 나는 이것이 꽤 늦었다는 것을 알고 있지만 str.format(). 예 : query = "SELECT * FROM {named_arg}"; query.format(**kwargs), 여기서는 query형식 문자열 이고은 형식 문자열 kwargsnamed_args 와 일치하는 키가있는 사전입니다 .
Edwin

4
예 @Cawas 아담 튜플 표기 사용 이외에는 {0}, {1}, {2}등등에 대응하는 튜플 인덱스 0, 12각각이. 또는 다음과 같이 args의 이름을 지정하고 (예 :) {named_arg}format 메서드에서 각각을 설정할 수도 있습니다 .'Hi {fname} {lname}!'.format(fname='John', lname='Doe')
Edwin

2
당신은 서로의 등을 두 질문의 중복 표시 한 @bignose google.com/...을
abhi

답변:


203

당신이 사용할 수있는 서식 고급 문자열 파이썬 2.6 및 파이썬 3.x를 사용할 수를 :

incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)

11
~ 내 개인적인 취향, kwargs로 스타일에 갈result = '{st} hello world {st} hello world {st}'.format(st=incoming)
nehem

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

이해를 돕기 위해 이것을 읽어보고 싶을 것입니다 : String Formatting Operations .


1
좋은. 이것에 대해 잊었다. locals ()도 할 것입니다.
Goutham

2
@Goutham : Python 버전이 최신 버전이면 Adam Rosenfield의 답변이 더 좋을 수 있습니다.
mhawke

사실입니다. 나는 여전히 새로운 문자열 형식화 작업에 익숙해지고 있습니다.
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 hello world % (string_goes_here) s hello world % (string_goes_here) s'% { 'string_goes_here': s,}. 사실상 무한한 가능성이 있습니다.
mhawke

3
mhawke : 브라우저가 페이지를 다시로드하기 전에 메시지를 게시했기 때문에 질문에 대한 답변이 이미 있는지 몰랐습니다. 무례 할 필요는 없습니다 !!.
Lucas S.

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

질문의 예는 'hello world'가 반복되는 것이 아니라 중복이없는 실제 템플릿이라고 생각합니다. 그래서 제가 반대표를 던졌습니다.
Gra

1

Fstrings

사용하는 경우 형식이 지정된 문자열을 나타내는 Python 3.6+새로운 소위 f-strings를 사용할 수 있으며 f문자열의 시작 부분에 문자 를 추가하여 이것을 f-string 으로 식별하는 데 사용할 수 있습니다 .

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 데이터 분석, Daniel Y. Chen

벤치 마크

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

천만 테스트를 실행하면 새로운 f-strings것이 실제로 매핑에서 더 빠른 것 같습니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.