목록과 함께 Python 문자열 형식화 사용


111

sPython 2.6.5 %s에서 list의 항목 수와 일치 하는 다양한 토큰 수를 갖는 문자열 을 생성 합니다 x. 형식이 지정된 문자열을 작성해야합니다. 다음은 작동하지 않지만 수행하려는 작업을 나타냅니다. 이 예에는 3 개의 %s토큰이 있고 목록에는 3 개의 항목이 있습니다.

s = '%s BLAH %s FOO %s BAR'
x = ['1', '2', '3']
print s % (x)

출력 문자열은 다음과 같습니다.

1 BLAH 2 FOO 3 BAR

답변:


112
print s % tuple(x)

대신에

print s % (x)

5
(x)와 동일합니다 x. 단일 토큰을 괄호로 묶는 것은 Python에서 의미가 없습니다. 일반적으로 foo = (bar, )읽기 쉽도록 대괄호를 넣지 만 foo = bar,정확히 동일한 작업을 수행합니다.
patrys 2011 년

11
print s % (x)OP가 쓴 것입니다. 나는 그 / 그녀를 인용하고있었습니다.
적외선 '

나는 단지 당신의 대답을 비판하지 않고 언어 팁을 제공하고 있었다 (사실 나는 그것을 +1했다). 당신은 foo = (bar, )어느 쪽도 쓰지 않았습니다 :)
patrys

2
(x)명확성을 위해 표기법을 사용합니다 . 또한 나중에 변수를 추가 할 때 대괄호를 잊어 버리는 것을 방지합니다.
SabreWolfy 2011 년

여러 목록에서 변수를 가져 오려면 어떻습니까? 튜플은 하나의 목록을 소요하고, 포맷은 하나의 튜플을 보인다
errant.info

150

파이썬 의 포맷 방법을 살펴보아야합니다 . 그런 다음 다음과 같이 형식 지정 문자열을 정의 할 수 있습니다.

>>> s = '{0} BLAH BLAH {1} BLAH {2} BLAH BLIH BLEH'
>>> x = ['1', '2', '3']
>>> print s.format(*x)
'1 BLAH BLAH 2 BLAH 3 BLAH BLIH BLEH'

1
OP의 문제는 방법이 아니라 매개 변수의 형식입니다. %연산자는 튜플 만 압축 해제합니다.
patrys 2011 년

이것은 s단순히 %s각 위치에 대해 증가하는 숫자를 포함해야하기 때문에 구성을 더 복잡 하게 만들 것 입니다. s여러 단계로 구성되므로 %s토큰을 포함하는 것이 훨씬 쉽습니다 .
SabreWolfy 2011 년

2
@SabreWolfy 미리 생성 한 경우 자리 표시 자의 이름을 지정하고 dict를 사용하여 결과 문자열의 형식을 지정하는 것이 더 쉬울 수 있습니다 print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}.
patrys 2011 년

2
@SabreWolfy : Python 2.7에서는 필드 번호를 생략 할 수 있습니다.s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
추후 공지가있을 때까지 일시 중지되었습니다.

이 대답은 0, 1, 2의 숫자 값이 "BLAH"라는 단어가 나타나는 횟수와 관련이있는 것처럼 보이기 때문에 혼란 스러울 수 있습니다.
SabreWolfy

31

리소스 페이지 에 따라 x의 길이가 다른 경우 다음을 사용할 수 있습니다.

', '.join(['%.2f']*len(x))

목록에서 각 요소에 대한 자리 표시자를 만듭니다 x. 다음은 그 예입니다.

x = [1/3.0, 1/6.0, 0.678]
s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x)
print s
>>> elements in the list are [0.33, 0.17, 0.68]

1
이제 링크가 끊어졌습니다.
MK Hunter

19

여기에 하나의 라이너가 있습니다. 목록을 반복하기 위해 print () 형식을 사용하는 약간의 즉석 답변.

이것은 어때요 (python 3.x) :

sample_list = ['cat', 'dog', 'bunny', 'pig']
print("Your list of animals are: {}, {}, {} and {}".format(*sample_list))

format () 사용에 대한 문서를 여기에서 읽으십시오 .


18

이 멋진 것에 대해 방금 배웠기 때문에 (형식 문자열 내에서 목록으로 인덱싱)이 오래된 질문에 추가하고 있습니다.

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR'
x = ['1', '2', '3']
print (s.format (x=x))

산출:

1 BLAH 2 FOO 3 BAR

그러나 나는 여전히 슬라이싱 (형식 문자열 내부)을 수행하는 방법을 찾지 못했고 '"{x[2:4]}".format...누군가 아이디어가 있는지 알아 내고 싶지만 단순히 그렇게 할 수 없다고 생각합니다.


슬라이싱에 대한 사용 사례에 대해 조금 궁금합니다.
Michael

1
난 ... 난 그냥 할 수 있도록 깔끔한 것이라고 생각 정말 하나를 생각 해달라고
Joran 비즐리

11

이것은 재미있는 질문이었습니다! 가변 길이 목록에 대해 이를 처리하는 또 다른 방법 은 .format메소드 및 목록 압축 해제를 최대한 활용하는 함수를 빌드하는 것입니다 . 다음 예에서는 멋진 서식을 사용하지 않지만 필요에 맞게 쉽게 변경할 수 있습니다.

list_1 = [1,2,3,4,5,6]
list_2 = [1,2,3,4,5,6,7,8]

# Create a function that can apply formatting to lists of any length:
def ListToFormattedString(alist):
    # Create a format spec for each item in the input `alist`.
    # E.g., each item will be right-adjusted, field width=3.
    format_list = ['{:>3}' for item in alist] 

    # Now join the format specs into a single string:
    # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
    s = ','.join(format_list)

    # Now unpack the input list `alist` into the format string. Done!
    return s.format(*alist)

# Example output:
>>>ListToFormattedString(list_1)
'  1,  2,  3,  4,  5,  6'
>>>ListToFormattedString(list_2)
'  1,  2,  3,  4,  5,  6,  7,  8'

3

@neobot의 답변과 동일하지만 좀 더 현대적이고 간결합니다.

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'

0
x = ['1', '2', '3']
s = f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR"
print(s)

출력은

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